我创建了新的Rails应用程序,并安装了Devise和omniauth-facebook gem.
@H_301_2@并设置我的Facebook应用程序,作为测试环境.
@H_301_2@所以,我通过Facebook登录并注册了我的新Rails应用程序,但request.env没有包含电子邮件地址.info.
@H_301_2@这是返回request.env [‘omniauth.auth’]
Ruby ver是2.2.2p95 @H_301_2@这是宝石版本
{ "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" } } }@H_301_2@它架子request.env [‘omniauth.auth’] [‘info’] [’email’] @H_301_2@如何通过oauth从Facebook获取电子邮件地址?请有人帮我 @H_301_2@Rails ver为4.2.3
Ruby ver是2.2.2p95 @H_301_2@这是宝石版本
omniauth (1.2.2) omniauth-facebook (2.0.1) devise (3.5.1)@H_301_2@配置/初始化/ devise.rb
config.omniauth :facebook,'appId','appSeacret',scope: 'email,public_profile'@H_301_2@应用程序/控制器/ 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@H_301_2@应用程序/模型/ 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@H_301_2@在2015/7/11添加 @H_301_2@我用旧的测试Facebook应用程序重试了相同的代码,并且可以获得完整的public_profile和电子邮件. @H_301_2@是否添加新的Facebook应用程序的任何限制?有人知道吗
解决方法
我找到了自己的电子邮件地址的方式.
@H_301_2@https://developers.facebook.com/docs/apps/changelog#v2_4
@H_301_2@这个文件说
@H_301_2@Declarative Fields To try to improve performance on mobile networks,@H_301_2@所以,它需要在config / initializers / devise.rb中写入
Nodes and Edges in v2.4 requires that you explicitly request the
field(s) you need for your GET requests. For example,GET
/v2.4/me/Feed no longer includes likes and comments by default,but
GET /v2.4/me/Feed?fields=comments,likes will return the data. For more
details see the docs on how to request specific fields.
config.omniauth :facebook,'app_id','app_secret',scope: 'email',info_fields: 'email'@H_301_2@范围:’email’是默认值 @H_301_2@不仅仅是范围,还有info_fields.