我使用Devise gem为我的应用设置用户模型。我正在尝试使用Omniauth进行Facebook身份验证。我可以检索Name
和Email
数据,但我无法获取任何其他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'
奇怪的是,我甚至无法获得数据的类类型。 Name
和Email
返回&#34;字符串&#34;如果我对它们调用class.to_s
,但所有其他数据都会返回&#34; NilClass&#34;。
我做错了什么?
好吧,我真的不知道可能会有什么变化,但现在这个相同的代码突然有效......所以问题解决了我猜?
答案 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/
这将有助于您了解权限,缺少数据问题或集成问题。