8

我正在使用 NoamB 的Sorcery Authentication Gem 0.7.7版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 方法实现这种行为,但我希望将这些东西与模型分开,并且我希望能够专门为每个提供者定义它们。

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

谢谢你的帮助!

4

1 回答 1

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

于 2017-03-11T19:21:41.637 回答