Search code examples
ruby-on-railsrubydeviseomniauthomniauth-facebook

omniauth.auth for Facebook not returning full hash and not able to successfully login with facebook


I'm working on the facebook clone project from http://www.theodinproject.com/ruby-on-rails/final-project.

I'm stuck with the omniauth-facebook portion, and I'm not able to successfully login with facebook. I think the problem might be due to the request.env["omniauth.auth"]. When I try to raise request.env["omniauth.auth"].to_yaml. I get the following incomplete hash. It's missing a lot of information such as first_name, last_name, gender, etc.

--- !ruby/hash:OmniAuth::AuthHash
provider: facebook
uid: '10206926404981253'
info: !ruby/hash:OmniAuth::AuthHash::InfoHash
  name: Thomas Pan
  image: http://graph.facebook.com/10206926404981253/picture
credentials: !ruby/hash:OmniAuth::AuthHash
  token: <token>
  expires_at: 1442277104
  expires: true
extra: !ruby/hash:OmniAuth::AuthHash
  raw_info: !ruby/hash:OmniAuth::AuthHash
    name: Thomas Pan
    id: <id>

** Replaced some info with <> for security.

I'm using this along with devise as well.

Everything else seems to be set up correctly as I've followed the instructions here for devise and omniauth-facebook. https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview

user.rb

devise :database_authenticatable, :registerable,
   :recoverable, :rememberable, :trackable, :validatable,
   :omniauthable, :omniauth_providers => [:facebook]

def self.from_omniauth(auth)
  where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
    user.email = auth.info.email
    user.password = Devise.friendly_token[0,20]
    user.first_name = auth.info.first_name
    user.last_name = auth.info.last_name
    user.gender = auth.extra.raw.gender
  end  
end  

devise.rb

config.omniauth :facebook, ENV['FB_APP_ID'], ENV['FB_APP_SECRET']

routes.rb

devise_for :users, :controllers => { :registrations => "users/registrations", :omniauth_callbacks => "users/omniauth-callbacks" }

omniauth_callbacks_controller.rb

def facebook
  raise request.env['omniauth.auth'].to_yaml
  end
end

Any assistance would be greatly appreciated!

Version info: Rails 4.2.1 Ruby 2.0.0


Solution

  • In devise.rb:

    config.omniauth :facebook, ENV['FB_APP_ID'], ENV['FB_APP_SECRET'], scope: 'email', info_fields: 'email,name,first_name,last_name,gender'