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

ale*_*lex 8 ruby authentication ruby-on-rails devise sorcery

我现在用的的0.7.7版本法术宝石认证通过NoamB我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" ...
Run Code Online (Sandbox Code Playgroud)

我知道我可以在我的用户模型上使用setter方法实现这种行为,但我希望将这些内容与模型分开,并希望能够为每个提供程序专门定义它们.

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

谢谢你的帮助!

geo*_*ock 0

看起来您可以通过扩展各种 Sorcery 提供程序类来将您想要的特定于应用程序的字段添加到用户信息哈希中来实现此目的。

例如,要使用 Twitter,您可能会定义如下内容:

config.external_providers = [:twitter]
Run Code Online (Sandbox Code Playgroud)

您可以将其更改为:

config.external_providers = [:TwitterWithAvatar]
Run Code Online (Sandbox Code Playgroud)

现在您需要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
Run Code Online (Sandbox Code Playgroud)

现在您可以设置映射:

config.TwitterWithAvatar.user_info_mapping = {avatar: "avatar"}
Run Code Online (Sandbox Code Playgroud)

或者,由于您已经在使用自定义提供程序类,因此您可以将映射移至该类中:

module Sorcery
  module Providers
    class TwitterWithAvatar < Twitter
      def user_info_mapping
        {
          avatar: "avatar",
          # ...
        }
      end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

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