9

我创建了新的 Rails 应用程序并安装了 Devise 和omniauth-facebook gem。

并将我的 Facebook 应用程序设置为测试环境。

因此,我通过 facebook 登录并注册了我的新 Rails 应用程序,但 request.env 不包含电子邮件地址.info。

这是返回 request.env['omniauth.auth']

{
   "provider" => "facebook",
   "uid" => "xxxxxxxxxxxx",
   "info" => {
         "name" => "xxxxxxx",
        "image" => "http://graph.facebook.com/xxx/picture"
    },
    "credentials" => {
             "token" => "tokenstring",
        "expires_at" => xxxxxxxxx,
           "expires" => true
    },
          "extra" => {
        "raw_info" => {
            "name" => "xxx xxxx",
              "id" => "xxxxxxxxx"
        }
    }
}

它机架 request.env['omniauth.auth']['info']['email']

如何通过 oauth 从 facebook 获取电子邮件地址?请任何人帮助我。

Rails 版本是 4.2.3 Ruby 版本是 2.2.2p95

这是宝石版本

 omniauth (1.2.2)
 omniauth-facebook (2.0.1)
 devise (3.5.1)

配置/初始化程序/devise.rb

  config.omniauth :facebook, 'appId', 'appSeacret', scope: 'email,public_profile'

应用程序/控制器/omniauth_callbacks_controller.rb

  def all_provider
    user = User.from_omniauth(request.env['omniauth.auth'])
    if user.persisted?
      sign_in_and_redirect user
    else
      session['devise.user_attributes'] = user.attributes
      redirect_to new_user_registration_url
    end
  end

  alias_method :facebook, :all_provider

应用程序/模型/user.rb

def from_omniauth(auth)
  where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
    user.email = auth.info.email
  end
end

添加于 2015/7/11

我用我的旧测试 facebook 应用程序重试了相同的代码,并且可以获得完整的 public_profile 和电子邮件。

新的 Facebook 应用程序是否添加了任何限制?有人知道吗?

4

1 回答 1

15

我自己找到了获取电子邮件地址的方法。

https://developers.facebook.com/docs/apps/changelog#v2_4

这个文档说

声明性字段 为了尝试提高移动网络的性能,v2.4 中的节点和边缘要求您明确请求 GET 请求所需的字段。例如,GET /v2.4/me/feed 默认不再包含点赞和评论,但 GET /v2.4/me/feed?fields=comments,likes 会返回数据。有关更多详细信息,请参阅有关如何请求特定字段的文档。

所以,它需要写在 config/initializers/devise.rb

  config.omniauth :facebook, 'app_id', 'app_secret',  scope: 'email', info_fields: 'email'
  • scope: 'email'是默认的

不仅是范围,还有 info_fields。

于 2015-07-12T05:16:19.483 回答