如何从 Rails 4 的 omniauth 获取 Facebook 用户电子邮件?
How to get the Facebook user email from omniauth for Rails 4?
如何通过 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">
return 中似乎没有电子邮件。
但是我需要电子邮件来通过我的模型验证,所以我该怎么办?
谢谢!
理论上user.auth.info.email
应该是这样
https://github.com/mkdynamic/omniauth-facebook
...但实际上,如果用户不想发布电子邮件,Facebook 没有必要 return 发送电子邮件。 (例如 Twitter 永远不会通过电子邮件回复您)
因此,您直接从 Oauth 回调 return 中创建用户的方法对您来说可能是错误的。
如果您真的需要来自用户的电子邮件,请尝试将任何 OAuth returns 保存到 Identity
模型,然后如果电子邮件存在则创建用户,如果电子邮件不存在则提示用户在 "finish signup form" 中提供将创建用户的电子邮件。
想一想:从技术上讲,Oauth 是一种协议,用户可以在其中注册您的应用程序而无需提供任何凭据 => Provide-UID is what defines him
而不是电子邮件
因此,您要么将处理会话的方式拆分为 User(email&password) or Identity(OAuth)
,以便在您的控制器中使用 current_user || current_identity
....或者当提供电子邮件时,您将 link 它们
它存在于授权中。
auth.info.email
如何通过 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">
return 中似乎没有电子邮件。 但是我需要电子邮件来通过我的模型验证,所以我该怎么办?
谢谢!
理论上user.auth.info.email
应该是这样
https://github.com/mkdynamic/omniauth-facebook
...但实际上,如果用户不想发布电子邮件,Facebook 没有必要 return 发送电子邮件。 (例如 Twitter 永远不会通过电子邮件回复您)
因此,您直接从 Oauth 回调 return 中创建用户的方法对您来说可能是错误的。
如果您真的需要来自用户的电子邮件,请尝试将任何 OAuth returns 保存到 Identity
模型,然后如果电子邮件存在则创建用户,如果电子邮件不存在则提示用户在 "finish signup form" 中提供将创建用户的电子邮件。
想一想:从技术上讲,Oauth 是一种协议,用户可以在其中注册您的应用程序而无需提供任何凭据 => Provide-UID is what defines him
而不是电子邮件
因此,您要么将处理会话的方式拆分为 User(email&password) or Identity(OAuth)
,以便在您的控制器中使用 current_user || current_identity
....或者当提供电子邮件时,您将 link 它们
它存在于授权中。
auth.info.email