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
source share