2015-07-10 80 views
9

我创建了新的Rails应用程序并安装了Devise和omniauth-facebook gem。omniauth-facebook无法获取电子邮件地址

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

所以,我通过Facebook登录并注册了我的新Rails应用程序,但request.env没有包含电子邮件address.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" 
     } 
    } 
} 

IT机架request.env [ 'omniauth.auth'] [ '信息'] [ '电子邮件']

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

滑轨ver是4.2.3 红宝石ver是2.2.2p95

这是Gem版本

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

配置/初始化/ devise.rb

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

应用程序/控制器/ omn​​iauth_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应用程序是否添加了任何限制?有人知道吗?

回答

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将返回数据。有关更多 的详细信息,请参阅有关如何请求特定字段的文档。

因此,它需要在配置/初始化/ devise.rb

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

不仅范围,而且info_fields。

+5

我不工作,我不知道为什么,在我的色器件Config中config.omniauth:脸谱,p.key,p.secret,范围:“电子邮件”,info_fields:“电子邮件,姓名”,但是当试图让电子邮件用户omniauth [:信息] [:电子邮件],这是空 –

+0

同样的问题存在于我 – Rubyist

+0

这是行不通的。 – Red