gpt4 book ai didi

ruby-on-rails - Sorcery Gem - 外部提供商的自定义 user_info_mapping

转载 作者:数据小太阳 更新时间:2023-10-29 06:55:10 26 4
gpt4 key购买 nike

我正在使用 Sorcery Authentication Gem 的 0.7.7 版通过 NoamB 在我的 Rails 3.2 应用程序

我正在寻找一种可能性,如何连接一种为特定外部登录提供商(例如 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

(我还没有尝试运行这段代码,所以细节可能有点不对,但从阅读 Sorcery 源代码来看,这看起来是正确的方向。)

关于ruby-on-rails - Sorcery Gem - 外部提供商的自定义 user_info_mapping,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10128572/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com