我创建了新的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"
}
}
}
它机架request.env ['omniauth.auth'] ['info'] ['email']
如何通过oauth从facebook获取电子邮件地址?请有人帮助我。
Rails ver是4.2.3 Ruby ver是2.2.2p95
这是Gem Versions
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应用添加了任何限制?有人知道吗?
答案 0 :(得分: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。