我在Rails 3.2 App
我正在寻找一种可能性,我可以如何连接一个为特定external login provider (e.g. facebook, twitter)
执行用户信息映射的方法。
例如,我想将提供的区域设置更改为我在数据库中使用的格式,或者我想从twitter下载用户头像作为匹配过程的一部分。
默认情况下,这种方式只能通过sorcery.rb
文件:
config.facebook.user_info_mapping = {:email => "email", :first_name => "first_name", :last_name => "last_name" ...
我知道我可以在我的用户模型上使用setter方法实现此类行为,但我希望将这些内容与模型分开,并希望能够专门为每个提供程序定义它们。
这可能吗? / 实现此类扩展映射选项的最佳方法是什么?
感谢您的帮助!
答案 0 :(得分:0)
看起来您可以通过扩展各种Sorcery提供程序类来将此操作添加到用户信息哈希中。
例如,要使用Twitter,您可能会定义类似的内容:
config.external_providers = [:twitter]
您可以将其更改为:
config.external_providers = [:TwitterWithAvatar]
现在您需要在TwitterWithAvatar
下定义Sorcery::Providers
提供商,并覆盖#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
(我没有尝试过运行这段代码,所以细节可能有些偏差,但是从阅读Sorcery源代码来看,这看起来是正确的方向。)