Facebook身份验证数据返回nil,但名称和电子邮件除外

时间:2016-09-09 03:31:11

标签: ruby-on-rails facebook devise omniauth omniauth-facebook

我使用Devise gem为我的应用设置用户模型。我正在尝试使用Omniauth进行Facebook身份验证。我可以检索NameEmail数据,但我无法获取任何其他public_profile数据。在这个例子中,我试图获得Gender,但其他数据都不起作用。当我访问此路径时:user_omniauth_authorize_path(:facebook)," facebook" " controllers / registrations_controller.rb"叫做。但对于创建的用户user.gender以及除姓名和电子邮件之外的所有其他数据,请回到零。

配置/初始化/ devise.rb

config.omniauth :facebook, "<ID>", "<SECRET>", scope: 'email', display: 'popup', info_fields: 'email,name,gender'

应用程序/模型/ devise.rb

  devise :omniauthable, :omniauth_providers => [:facebook]
  def self.from_omniauth(auth)
    where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
      user.gender = auth.extra.raw_info.gender.to_s
    end
  end

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

  def facebook
    @user = User.from_omniauth(request.env["omniauth.auth"])

    if @user.persisted?
      sign_in_and_redirect @user, :event => :authentication
      set_flash_message(:notice, :success, :kind => "Facebook") if is_navigational_format?
    else
      session["devise.facebook_data"] = request.env["omniauth.auth"]
      redirect_to new_user_registration_url
    end
  end

的Gemfile

gem 'devise'
gem 'omniauth-facebook'

奇怪的是,我甚至无法获得数据的类类型。 NameEmail返回&#34;字符串&#34;如果我对它们调用class.to_s,但所有其他数据都会返回&#34; NilClass&#34;。

我做错了什么?

更新

好吧,我真的不知道可能会有什么变化,但现在这个相同的代码突然有效......所以问题解决了我猜?

3 个答案:

答案 0 :(得分:3)

尝试这种方式

def self.from_omniauth(access_token)
  data = access_token.info
  email      = data.info.email
  first_name = data.first_name
  last_name  = data.last_name
end

答案 1 :(得分:1)

您可以使用gender

auth.info.gender属性
where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
  user.gender = auth.info.gender
end

答案 2 :(得分:1)

您确定用户将这些数据作为公开信息吗?

我会尝试在Facebook的开放图浏览器中调试权限 https://developers.facebook.com/tools/explorer/

这将有助于您了解权限,缺少数据问题或集成问题。