Facebook OAuth does not return email address in user information

I am installing spree 3.0 (ROR) and trying to use facebook oauth for authentication, but the fields sent back after successful output do NOT contain an email that is critical to our application. here is the result of a successful authentication on facebook.

#<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" 

as you can see, all that I will return is the username and their identifier. Are there any settings in my facebook application that I need to check in order to return an email? or is there another way that I should deal with Oauth? I just use the spree_social gem, which does it all internally, so in fact I haven't written any code.

here is the code. copied from a gem, I simply added the lines of a magazine to find out what was going on with 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 
+5
source share
3 answers

Facebook just released the latest APIv2.4, which by default does not return email, but we need to explicitly specify which fields to use.

Introducing the Graphic API v2.4

Now, in the latest version of omniauth-facebook (possibly 2.1.0), the "email" fields are set by default and just work.

Fix default info_fields for 'name, email' # 209

Or you can simply indicate how

 options['info_fields']='id,email,gender,link,locale,name,timezone,updated_time,verified'; 
+8
source

You may need to request email permission from the user to share email in your FB application.

Try adding this initilazer facebookstrategies.rb to request specific permissions for 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 
0
source

I had the same problem, and that is how I solved it.

In config/initializers/devise.rb add the following code:

 Devise.setup do |config| config.omniauth :facebook, your_app_id, your_app_secret, scope: 'public_profile,email', info_fields: 'email,name' end 
0
source

All Articles