如何从 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