如何从omniauth获取Rails 4的Facebook用户电子邮件?

时间:2016-02-24 09:43:11

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

如何通过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">

似乎没有电子邮件作为回报。 但我需要电子邮件通过我的模型验证,所以我该怎么办?

谢谢!

2 个答案:

答案 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