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

标签 ruby-on-rails ruby authentication devise sorcery

我正在使用 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/

相关文章:

ruby-on-rails - 自定义 "created_at"列 Ruby on Rails

python - WSGI/Django : pass username back to Apache for access log

ruby-on-rails - 显示评分最高的对象。 Letsrate,Rails

ruby-on-rails - 如何使用 capistrano 进行部署

ruby-on-rails - 为什么需要显式加载可安装引擎的迁移和种子?

security - MEF:组件认证

http - 为什么在 HTTP 请求的 'Bearer' header 中的 token 之前需要 'Authorization'?

ruby-on-rails - 在Omniauth和Ruby on Rails 3中使用YouTube登录

mysql - Ruby on Rails :Access data from other table's column

javascript - 更改缩放比例会导致所有隐藏标记重新出现在 Google map (Gmaps4rails) 上