Ruby on rails 如何从omniauth获取用于Rails 4的Facebook用户电子邮件?
如何通过omniauth for Rails获取Facebook用户电子邮件? 这是我的omniauth.rbRuby 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.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中没有任何信息在这种情况下,用户可能没有电子邮件,他是按他的电话号码登记的。