Sorcery Gem - 为外部提供商定制user_info_mapping

时间:2012-04-12 17:21:09

标签: ruby-on-rails ruby authentication devise sorcery

我在Rails 3.2 App

上使用NoamB的Sorcery Authentication Gem版本0.7.7

我正在寻找一种可能性,我可以如何连接一个为特定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方法实现此类行为,但我希望将这些内容与模型分开,并希望能够专门为每个提供程序定义它们。

这可能吗? / 实现此类扩展映射选项的最佳方法是什么?

感谢您的帮助!

1 个答案:

答案 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源代码来看,这看起来是正确的方向。)