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

Ruby on rails 如何从omniauth获取用于Rails 4的Facebook用户电子邮件?,ruby-on-rails,facebook,omniauth,omniauth-facebook,Ruby On Rails,Facebook,Omniauth,Omniauth Facebook,如何通过omniauth for 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', :dis

如何通过omniauth for 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">
auth.providerauth.providerauth.providerauth.provider
#
似乎没有回信。 但是我需要电子邮件来通过我的模型验证,那么我应该怎么做呢


谢谢

理论上,user.auth.info.email应该是这样的

。。。但实际上,如果用户不想发布电子邮件,Facebook不需要回复电子邮件。(例如,Twitter永远不会给你回复电子邮件)

因此,直接从Oauth回调返回的内容创建用户的方法可能对您来说是错误的

如果您确实需要用户发送电子邮件,请尝试保存OAuth返回到
标识
模型的任何内容,然后如果存在电子邮件,则创建用户,如果不存在电子邮件,则提示用户以“完成注册表单”提供电子邮件,以创建用户

想想看:从技术上讲,Oauth是一种协议,用户可以在不提供任何凭据的情况下注册您的应用程序=>定义他的是
providuid
而不是电子邮件


因此,您可以将处理会话的方式拆分为
User(电子邮件和密码)或Identity(OAuth)
,以便在控制器中执行类似
current_User | | current_Identity
的操作……或者在提供电子邮件时将它们链接起来。

理论上,应该是
User.auth.info.email

。。。但实际上,如果用户不想发布电子邮件,Facebook不需要回复电子邮件。(例如,Twitter永远不会给你回复电子邮件)

因此,直接从Oauth回调返回的内容创建用户的方法可能对您来说是错误的

如果您确实需要用户发送电子邮件,请尝试保存OAuth返回到
标识
模型的任何内容,然后如果存在电子邮件,则创建用户,如果不存在电子邮件,则提示用户以“完成注册表单”提供电子邮件,以创建用户

想想看:从技术上讲,Oauth是一种协议,用户可以在不提供任何凭据的情况下注册您的应用程序=>定义他的是
providuid
而不是电子邮件

因此,您可以将处理会话的方式拆分为
User(电子邮件和密码)或Identity(OAuth)
,例如控制器中的
current_User | | current_Identity
,或者在提供电子邮件时将它们链接到auth中

auth.info.email
它存在于auth中

auth.info.email

另一种思考方式是:无论Facebook在
auth
(信息内容)中返回什么,都更像是“好消息”,而不是必要的合同。你和Facebook之间的唯一合同是
auth.uid
。如果明天facebook决定改变他们的API,不再提供“名字”,你的应用不应该受到影响。构建身份验证逻辑不依赖于
info
中的项目,而是依赖于
提供者uid
组合。另一种思考方式是:无论Facebook在
auth
中返回什么(信息内容),都更像是“好消息”,而不是必要的合同。你和Facebook之间的唯一合同是
auth.uid
。如果明天facebook决定改变他们的API,不再提供“名字”,你的应用不应该受到影响。构建身份验证逻辑不依赖于
info
中的项目,而是依赖于
provider uid
组合我在auth.info.email中没有任何信息在这种情况下,用户可能没有电子邮件,他是通过他的电话号码注册的。我在auth.info.email中没有任何信息在这种情况下,用户可能没有电子邮件,他是按他的电话号码登记的。