如何通过omniauth为Rails获取Facebook用户电子邮件? 这是我的omniauth.rb
OmniAuth.config.logger = Rails.logger
Rails.application.config.middleware.use OmniAuth::Builder do
provider :facebook, ENV['FACEBOOK_KEY'] , ENV['FACEBOOK_SECRET'], :scope => 'email', :display => 'popup', :info_fields => 'name,email'
end
这是我的模特
def self.from_omniauth(auth)
where(provider: auth.provider, uid: auth.uid).first_or_initialize.tap do |user|
puts "auth.providerauth.providerauth.providerauth.provider"
puts auth.info.inspect
user.provider = auth.provider
user.uid = auth.uid
user.name = auth.info.name
user.oauth_token = auth.credentials.token
user.oauth_expires_at = Time.at(auth.credentials.expires_at)
user.username = auth.info.name.gsub(" ","") + new_token
user.email = auth.info.email
user.password = digest(new_token)
user.save!
end
end
但我只从信息中得到了这个
auth.providerauth.providerauth.providerauth.provider
#<OmniAuth::AuthHash::InfoHash image="http://graph.facebook.com/xxxx" name="xxx xxxx">
似乎没有电子邮件作为回报。 但我需要电子邮件通过我的模型验证,所以我该怎么办?
谢谢!
答案 0 :(得分:3)
理论上user.auth.info.email
应该是这种情况
https://github.com/mkdynamic/omniauth-facebook
...但实际上,如果用户不想发布电子邮件,Facebook就没有必要返回电子邮件。 (例如,Twitter永远不会通过电子邮件回复您)
所以你直接从Oauth回调中返回创建用户的方法对你来说可能是错误的。
如果您确实需要来自用户的电子邮件,请尝试将OAuth返回的任何内容保存到Identity
模型,然后如果存在电子邮件,请创建用户,如果电子邮件不存在则提示用户提供电子邮件&#34;完成注册表格&#34;这将创建用户。
考虑一下:从技术上讲,Oauth是一种协议,用户可以在不提供任何凭据的情况下注册您的应用程序=&gt; Provide-UID is what defines him
而不是电子邮件
因此,您要么将会话处理方式分为User(email&password) or Identity(OAuth)
,以便在控制器中使用current_user || current_identity
,或者在提供电子邮件时将其链接
答案 1 :(得分:1)
它存在于身份验证中。
auth.info.email