Facebook OAuth 不返回用户信息中的电子邮件
Facebook OAuth is not returning email in user info
我正在安装 spree 3.0 (ROR) 并尝试使用 facebook oauth 进行身份验证,但在成功完成 oauth 后发回的字段不包含电子邮件,这对我们的应用程序至关重要。这是来自 facebook 成功验证的return。
#<OmniAuth::AuthHash credentials=#<OmniAuth::AuthHash expires=true expires_at=1442435073 token="CAAJa3dyBtY4BAJ2ZB3vrenNOFJKSMtvxYO09ZCJtEsmKNBs90q9nmUF4LIBr06xCizEAR3lwht3BwycLkVFdjlvkS1AUGpYODQHu25K0uO8XLDDPkTO0E9oPdIILsbTTOuIT7qcl8nJ6501z0dCXEi9hVNwPYqZBbGqiEhyoLyVgCNnDWdPRLBRF5xSovJdhjjCf6XC8ulJ4NnKBfM8"> extra=#<OmniAuth::AuthHash raw_info=#<OmniAuth::AuthHash id="101230990227589" name="David Alajbbjfdjgij Bowersstein">> info=#<OmniAuth::AuthHash::InfoHash image="http://graph.facebook.com/101230990227589/picture" name="David Alajbbjfdjgij Bowersstein"> provider="facebook" uid="101230990227589"
如您所见,我返回的只是用户名和他们的 ID。我的 Facebook 应用程序上是否有一些设置需要检查才能取回电子邮件?还是我应该以不同的方式进行 Oauth?我只是使用 spree_social gem 它在内部完成这一切,所以我实际上没有为此编写任何代码。
这是代码。从 gem 复制出来,我只是添加了日志行以查看从 facebook 返回的内容。
def #{provider}
authentication = Spree::UserAuthentication.find_by_provider_and_uid(auth_hash['provider'], auth_hash['uid'])
if authentication.present? and authentication.try(:user).present?
flash[:notice] = I18n.t('devise.omniauth_callbacks.success', kind: auth_hash['provider'])
sign_in_and_redirect :spree_user, authentication.user
elsif spree_current_user
spree_current_user.apply_omniauth(auth_hash)
spree_current_user.save!
flash[:notice] = I18n.t('devise.sessions.signed_in')
redirect_back_or_default(account_url)
else
user = Spree::User.find_by_email(auth_hash['info']['email']) || Spree::User.new
user.apply_omniauth(auth_hash)
Rails.logger.debug("THE AUTO HASH")
Rails.logger.debug(auth_hash.inspect)
if user.save
flash[:notice] = I18n.t('devise.omniauth_callbacks.success', kind: auth_hash['provider'])
sign_in_and_redirect :spree_user, user
else
session[:omniauth] = auth_hash.except('extra')
flash[:notice] = Spree.t(:one_more_step, kind: auth_hash['provider'].capitalize)
redirect_to new_spree_user_registration_url
return
end
end
if current_order
user = spree_current_user || authentication.user
current_order.associate_user!(user)
session[:guest_token] = nil
end
end
可能您需要请求用户的电子邮件许可才能将电子邮件共享到您的 FB 应用程序。
尝试添加此initilazerfacebookstrategies.rb
向facebook请求特定权限。
module OmniAuth
module Strategies
class Facebook < OAuth2
MOBILE_USER_AGENTS = 'palm|blackberry|nokia|phone|midp|mobi|symbian|chtml|ericsson|minimo|' +
'audiovox|motorola|samsung|telit|upg1|windows ce|ucweb|astel|plucker|' +
'x320|x240|j2me|sgh|portable|sprint|docomo|kddi|softbank|android|mmp|' +
'pdxgw|netfront|xiino|vodafone|portalmmm|sagem|mot-|sie-|ipod|up\.b|' +
'webos|amoi|novarra|cdm|alcatel|pocket|ipad|iphone|mobileexplorer|' +
'mobile'
def request_phase
options[:scope] ||= "email,offline_access,user_birthday,public_profile"
options[:display] = mobile_request? ? 'touch' : 'page'
super
end
def mobile_request?
ua = Rack::Request.new(@env).user_agent.to_s
ua.downcase =~ Regexp.new(MOBILE_USER_AGENTS)
end
end
end
end
Facebook 刚刚发布了最新的 APIv2.4,默认情况下 return 不发送电子邮件,但我们需要 明确地 指定要使用的字段。
现在,在最新的 omniauth-facebook(可能是 2.1.0)上,"email" 字段是默认指定的并且可以正常工作。
Fix default info_fields to 'name,email' #209
或者,您可以只指定喜欢
options['info_fields']='id,email,gender,link,locale,name,timezone,updated_time,verified';
我遇到了同样的问题,我就是这样解决的。
在config/initializers/devise.rb
中添加以下代码:
Devise.setup do |config|
config.omniauth :facebook, your_app_id, your_app_secret, scope: 'public_profile,email', info_fields: 'email,name'
end
我正在安装 spree 3.0 (ROR) 并尝试使用 facebook oauth 进行身份验证,但在成功完成 oauth 后发回的字段不包含电子邮件,这对我们的应用程序至关重要。这是来自 facebook 成功验证的return。
#<OmniAuth::AuthHash credentials=#<OmniAuth::AuthHash expires=true expires_at=1442435073 token="CAAJa3dyBtY4BAJ2ZB3vrenNOFJKSMtvxYO09ZCJtEsmKNBs90q9nmUF4LIBr06xCizEAR3lwht3BwycLkVFdjlvkS1AUGpYODQHu25K0uO8XLDDPkTO0E9oPdIILsbTTOuIT7qcl8nJ6501z0dCXEi9hVNwPYqZBbGqiEhyoLyVgCNnDWdPRLBRF5xSovJdhjjCf6XC8ulJ4NnKBfM8"> extra=#<OmniAuth::AuthHash raw_info=#<OmniAuth::AuthHash id="101230990227589" name="David Alajbbjfdjgij Bowersstein">> info=#<OmniAuth::AuthHash::InfoHash image="http://graph.facebook.com/101230990227589/picture" name="David Alajbbjfdjgij Bowersstein"> provider="facebook" uid="101230990227589"
如您所见,我返回的只是用户名和他们的 ID。我的 Facebook 应用程序上是否有一些设置需要检查才能取回电子邮件?还是我应该以不同的方式进行 Oauth?我只是使用 spree_social gem 它在内部完成这一切,所以我实际上没有为此编写任何代码。
这是代码。从 gem 复制出来,我只是添加了日志行以查看从 facebook 返回的内容。
def #{provider}
authentication = Spree::UserAuthentication.find_by_provider_and_uid(auth_hash['provider'], auth_hash['uid'])
if authentication.present? and authentication.try(:user).present?
flash[:notice] = I18n.t('devise.omniauth_callbacks.success', kind: auth_hash['provider'])
sign_in_and_redirect :spree_user, authentication.user
elsif spree_current_user
spree_current_user.apply_omniauth(auth_hash)
spree_current_user.save!
flash[:notice] = I18n.t('devise.sessions.signed_in')
redirect_back_or_default(account_url)
else
user = Spree::User.find_by_email(auth_hash['info']['email']) || Spree::User.new
user.apply_omniauth(auth_hash)
Rails.logger.debug("THE AUTO HASH")
Rails.logger.debug(auth_hash.inspect)
if user.save
flash[:notice] = I18n.t('devise.omniauth_callbacks.success', kind: auth_hash['provider'])
sign_in_and_redirect :spree_user, user
else
session[:omniauth] = auth_hash.except('extra')
flash[:notice] = Spree.t(:one_more_step, kind: auth_hash['provider'].capitalize)
redirect_to new_spree_user_registration_url
return
end
end
if current_order
user = spree_current_user || authentication.user
current_order.associate_user!(user)
session[:guest_token] = nil
end
end
可能您需要请求用户的电子邮件许可才能将电子邮件共享到您的 FB 应用程序。
尝试添加此initilazerfacebookstrategies.rb
向facebook请求特定权限。
module OmniAuth
module Strategies
class Facebook < OAuth2
MOBILE_USER_AGENTS = 'palm|blackberry|nokia|phone|midp|mobi|symbian|chtml|ericsson|minimo|' +
'audiovox|motorola|samsung|telit|upg1|windows ce|ucweb|astel|plucker|' +
'x320|x240|j2me|sgh|portable|sprint|docomo|kddi|softbank|android|mmp|' +
'pdxgw|netfront|xiino|vodafone|portalmmm|sagem|mot-|sie-|ipod|up\.b|' +
'webos|amoi|novarra|cdm|alcatel|pocket|ipad|iphone|mobileexplorer|' +
'mobile'
def request_phase
options[:scope] ||= "email,offline_access,user_birthday,public_profile"
options[:display] = mobile_request? ? 'touch' : 'page'
super
end
def mobile_request?
ua = Rack::Request.new(@env).user_agent.to_s
ua.downcase =~ Regexp.new(MOBILE_USER_AGENTS)
end
end
end
end
Facebook 刚刚发布了最新的 APIv2.4,默认情况下 return 不发送电子邮件,但我们需要 明确地 指定要使用的字段。
现在,在最新的 omniauth-facebook(可能是 2.1.0)上,"email" 字段是默认指定的并且可以正常工作。
Fix default info_fields to 'name,email' #209
或者,您可以只指定喜欢
options['info_fields']='id,email,gender,link,locale,name,timezone,updated_time,verified';
我遇到了同样的问题,我就是这样解决的。
在config/initializers/devise.rb
中添加以下代码:
Devise.setup do |config|
config.omniauth :facebook, your_app_id, your_app_secret, scope: 'public_profile,email', info_fields: 'email,name'
end