我在我的Rails 3.2应用程序上使用NoamB的
Sorcery Authentication Gem版0.7.7
我正在寻找一种可能性,我可以如何连接一个方法,该方法正在为特定的外部登录提供商(例如,facebook,twitter)进行用户信息映射.
例如,我想将提供的区域设置更改为我在数据库中使用的格式,或者我想从twitter下载用户头像作为匹配过程的一部分.
默认情况下,它只能通过sorcery.rb文件:
config.facebook.user_info_mapping = {:email => "email",:first_name => "first_name",:last_name => "last_name" ...
我知道我可以在我的用户模型上使用setter方法实现这种行为,但我希望将这些内容与模型分开,并希望能够专门为每个提供程序定义它们.
这可能吗?
/
实现此类扩展映射选项的最佳方法是什么?
谢谢你的帮助!
解决方法
看起来您可以通过扩展各种Sorcery提供程序类来将此操作添加到用户信息哈希中.
例如,要使用Twitter,您可能会定义以下内容:
config.external_providers = [:twitter]
您可以将其更改为:
config.external_providers = [:TwitterWithAvatar]
现在您需要在Sorcery :: Providers下定义TwitterWithAvatar提供程序,并覆盖#get_user_hash方法:
module Sorcery module Providers class TwitterWithAvatar < Twitter def get_user_hash(access_token) user_hash = super user_hash.merge( avatar: get_avatar(user_hash[:uid]),) end private def get_avatar(uid) # Some Twitter API call end end end end
现在您可以设置映射:
config.TwitterWithAvatar.user_info_mapping = {avatar: "avatar"}
或者,由于您已经在使用自定义提供程序类,因此可以将映射移动到该类中:
module Sorcery module Providers class TwitterWithAvatar < Twitter def user_info_mapping { avatar: "avatar",# ... } end end end end