如何在各种环境中使用和配置omniauth与yahoo,google,facebook策略?

时间:2012-03-24 15:58:43

标签: ruby-on-rails authentication oauth omniauth ruby-on-rails-3.2

我正在开发一个Rails 3.2应用程序,允许用户通过多个提供商进行身份验证... Yahoo,Google,Facebook和/或Twitter。我们正在使用omniauth,虽然我理解基本的工作流程,但我找不到一个包含文档,说明应如何配置这些特定的提供程序,以及如何设置Rails应用程序,以便我可以正确地测试/使用这些策略开发,测试和生产环境。

所以我的问题:

  1. 对于这些提供商(yahoo,google,twitter,facebook)中的每一个,为omniauth单独配置每个提供商需要哪些步骤才能在开发,测试和生产环境中使用?

  2. 配置Rails应用程序以在我运行的任何环境中正确使用这些提供程序的最佳/推荐方法是什么?

  3. 谢谢 - wg

2 个答案:

答案 0 :(得分:6)

至于你的第一个问题:

您需要为Facebook,Google和Twitter创建应用,以允许使用其OAuth协议。至于雅虎,我不知道。雅虎是否仍然相关?开玩笑。有关所有可用的Omniauth提供程序策略的列表,请转到here

所以,Facebook:

https://developers.facebook.com/apps
Create app. You'll be given an API Key and an API Secret.
Settings > Basic > Website > Site URL:
  your_website_callback_url for production

Twitter的:

https://apps.twitter.com/
Create app. You'll be given an API Key and an API Secret.
Settings > Callback URL:
  your_website_callback_url for production

谷歌:

https://console.developers.google.com
Create app. You'll be given an API Key and an API Secret.
Services > Select necessary services and scopes
APIs & auth > Credentials > Create New Client ID:
  http://localhost:3000/ for development/testing
  your_website_callback_url for production

然后,你的Gemfile:

gem 'omniauth-facebook'
gem 'omniauth-twitter'
gem 'omniauth-google-oauth2'

创建文件以设置策略。该约定将其命名为omniauth.rb。每个提供商都有许多不同的选项,您必须调查它们是什么:

# config/initializers/omniauth.rb
Rails.application.config.middleware.use OmniAuth::Builder do
  provider :facebook, 'FACEBOOK_KEY', 'FACEBOOK_SECRET', {
    secure_image_url: 'true',
    image_size: 'square'
  }

  provider :twitter, 'TWITTER_KEY', 'TWITTER_SECRET', {
    secure_image_url: 'true',
    image_size: 'normal'
  }

  provider :google_oauth2, 'GOOGLE_KEY', 'GOOGLE_SECRET', {
    image_size: 50,
    image_aspect_ratio: 'square'
  }
end

然后关注this railscastthis wiki。你应该使用像ENV['FACEBOOK_KEY']这样的环境变量并在控制台中设置它们,以便你可以在运行时更改它们,这样它们就不会被推入你的存储库中(特别是如果你有公共文件) )。 Here's a solution解决了这个问题。

最后,您应该搜索每个提供商的gem wiki以获取额外信息。例如,facebook's omniauth gem readme提供了当用户通过Facebook进行身份验证时Facebook返回的身份验证哈希的示例。然后,您可以使用此信息来自定义您的用户模型(根据您的要求更新其全名或图像)。它还提到了如何请求额外的权限来访问不公开的用户数据。

编辑:回答你的问题:

就像我说的那样,我真的很喜欢Railscasts,我跟随了两集,其中集成了Devise和OmniAuth。在这些剧集中,omniauth-openid gem用于向Google进行身份验证。它的缺点是,由于您没有注册应用程序,因此无法自定义身份验证提示。通过Facebook和Twitter,您可以选择名称,键入说明并上传应用程序的徽标。您还可以在您的网站上设置指向“隐私”和“使用条款”页面的链接。当用户尝试使用这些服务登录时,所有这些小细节都会显示给用户,您可以想象它们会影响您的用户转化率。

使用omniauth-openid,您无法自定义提示,并且您获得的信息有限(仅限电子邮件和与该帐户关联的名称)。如果这就是你所需要的,那么你就完全了。但是,如果您想获取用户的图片,可能只能访问用户的Google+个人资料中提供的其他私人信息,那么最好只使用omniauth-google2

OmniAuth的好处在于,一旦你掌握了基础知识,添加其他提供商就像注册应用程序,获取API密钥和秘密以及包含某个宝石一样简单。我建议先从Facebook开始,因为它是最受欢迎的服务,因此是文档最多的(或者至少在SO上有更多问题的那个)。从那里,构建您的应用程序并添加其他身份验证方法。

答案 1 :(得分:0)

目前我将环境特定的东西放在config / initializers / devise.rb中。例如Facebook:

  # Facebook strategy
  require "omniauth-facebook"

    case Rails.env
    when "development"
      config.omniauth :facebook, 'xxx', 'xxx', {:scope => 'manage_pages,publish_stream,offline_access,email'}
    when "production"
      config.omniauth :facebook, 'xxx', 'xxx', {:scope => 'manage_pages,publish_stream,offline_access,email'}
    end

希望这可以帮助你。