Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

get first_name and last_name fields from facebook omniauth

I am now implementing omniauth feature into my app. Everything works fine except that i cant get the first and last name from the facebook. Here is my model code.

    def self.from_omniauth(auth)
    user = User.where(email: auth.info.email).first
    if user
      return user
    else
      where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
        user.provider = auth.provider
        user.uid = auth.uid
        user.first_name = auth.info.first_name
        user.last_name = auth.info.last_name
        user.email = auth.info.email
        user.image = auth.info.image
        user.password = Devise.friendly_token[0,20]
      end
    end

I already have the strong parameters setup properly for devise as am using that now for default authentication and is working properly.Is there any additional permissions necessary for first and last name from facebook?

like image 373
Abhilash Avatar asked Oct 12 '15 21:10

Abhilash


2 Answers

After some fiddling around i found the solution. Now i think we have to explicitly require the fields we require. For me the fix is just to add first_name and last_name to facebook.

In my initializers i added first_name and last_name to info fields.

info_fields: 'email, first_name, last_name'

Update

My full config file will look like this now

   config.omniauth :facebook, ENV["FACEBOOK_APP_ID"], ENV["FACEBOOK_SECRET"], scope: 'email', info_fields: 'email, first_name, last_name'
like image 119
Abhilash Avatar answered Nov 01 '22 17:11

Abhilash


From checking the Facebook docs, the first_name and last_name fields are both part of the public profile so your permissions should be fine.

No idea if this would work (in fact, I would kind of hope it doesn't), but in the implementation we've got working in production at the moment we're using Hash accessors instead of methods. So:

new(
  first_name: oauth_data["info"]["first_name"],                  
  last_name:  oauth_data["info"]["last_name"],     
  ...

Given your email etc fields are getting set correctly, I'd be surprised if trying that works, but it might be worth a shot.

Failing that, have you got any validations or before_create callbacks which could be interfering somehow?

like image 28
seddy Avatar answered Nov 01 '22 17:11

seddy