ruby-on-rails – Sorcery Gem – 为外部提供商定制user_info_mapping

我在我的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

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

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...