omn​​iauth-facebook cannnot获取电子邮件地址

myo*_*yoo 9 facebook ruby-on-rails devise omniauth omniauth-facebook

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

并将我的Facebook App设置为测试环境.

所以,我通过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"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Rails ver是4.2.3 Ruby ver是2.2.2p95

这是宝石版本

 omniauth (1.2.2)
 omniauth-facebook (2.0.1)
 devise (3.5.1)
Run Code Online (Sandbox Code Playgroud)

配置/初始化/ devise.rb

  config.omniauth :facebook, 'appId', 'appSeacret', scope: 'email,public_profile'
Run Code Online (Sandbox Code Playgroud)

应用程序/控制器/ 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
Run Code Online (Sandbox Code Playgroud)

应用程序/模型/ 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
Run Code Online (Sandbox Code Playgroud)

在2015/7/11添加

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

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

myo*_*yoo 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'
Run Code Online (Sandbox Code Playgroud)
  • scope: 'email' 是默认的

不仅是范围,还有info_fields.

  • 对我来说不工作,我不知道为什么,在我的设计配置中有config.omniauth:facebook,p.key,p.secret,范围:'email',info_fields:'email,name'但是当试图获取电子邮件用户omniauth时[:info] [:email],这是空的 (5认同)