Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Retrieving Google profile picture with Omniauth on Rails 3

I'm starting a new Rails 3 app using Omniauth for authentication via Facebook, Twitter and Google. I can easily get the user's avatar from Facebook and Twitter, but can't find a way to retrieve it from Google, if existent.

Here's the code I use to build the authentication hash:

omniauth['user_info']['email'] ? @authhash[:email] =  omniauth['user_info']['email'] : @authhash[:email] = ''
omniauth['user_info']['name'] ? @authhash[:name] =  omniauth['user_info']['name'] : @authhash[:name] = ''
omniauth['uid'] ? @authhash[:uid] = omniauth['uid'].to_s : @authhash[:uid] = ''
omniauth['provider'] ? @authhash[:provider] = omniauth['provider'] : @authhash[:provider] = ''

On Twitter and Facebook this next line gets the avatar or sets to the default if not provided:

omniauth['user_info']['image'] ? @authhash[:image] =  omniauth['user_info']['image'] : @authhash[:image] = 'avatar.jpg'

This doesn't work on Google and I couldn't find any documentation on that.

Any ideas?

Thanks a lot!

like image 595
rapcal Avatar asked Jan 18 '23 23:01

rapcal


2 Answers

Try 'Omniauth Google OAuth2 Strategy' in which a commit states:

Returns name, first_name, last_name, image, email in info with :scope => 'userinfo.email,userinfo.profile'

You can view the commit here

like image 87
Très Avatar answered Jan 31 '23 10:01

Très


Yes you can get the picture, though i would imagine it depends on what versions your using.

im using

rvm current ruby-1.9.3-p194

> gem list
oauth (0.4.6)
oauth2 (0.8.0)
omniauth (1.1.0, 1.0.3)
omniauth-facebook (1.4.1, 1.4.0)
omniauth-google (1.0.1)
omniauth-google-oauth2 (0.1.13)
omniauth-oauth (1.0.1)
omniauth-oauth2 (1.1.0, 1.0.3)
omniauth-twitter (0.0.12)

I arrived here for a different reason that was due to the fact that the naming convention to access the profile properties was different from those explain in various tutorials, as such i was experiencing error completing the sign in. In fact in your question you may find that you will have the same issues.

The problem is that google has different property names from FB, Twitter, etc. so you have to account for that.

To find the properties i commented out the doing bit, and just dumped the response out. like so.

elsif service_route == 'google_oauth2'
render :text => omniauth.to_yaml
return

This will output your google profile details which will hopefully look like the following.

--- !ruby/hash:OmniAuth::AuthHash
provider: google_oauth2
uid: '1234567'
info: !ruby/hash:OmniAuth::AuthHash::InfoHash
  name: Your Name
  email: yourEmail
  first_name: firstname
  last_name: surname
  image: https://animage
credentials: !ruby/hash:Hashie::Mash
  token: aToken
  expires_at: 123
  expires: true
extra: !ruby/hash:Hashie::Mash
  raw_info: !ruby/hash:Hashie::Mash
    id: '123456'
    email: YourEmail
    verified_email: true
    name: YourName
    given_name: Name
    family_name: surname
    link: https://plus.google.com/blah
    picture: https://lh6.googleusercontent.com/blah blah
    gender: male
    birthday: ''
    locale: en-GB

As you can see the names of the parameters are different, get rid of user_info and instead have info.

You will also notice that you have picture: and image: so whilst i have not tried this i would assume that it is your profile picture.

elsif service_route == 'google_oauth2'
    omniauth['info']['email'] ? email = omniauth['info']['email'] : email = ''
    omniauth['info']['name'] ? name = omniauth['info']['name'] : name = ''
    omniauth['uid'] ? uid = omniauth['uid'] : uid = ''
    omniauth['provider'] ? provider = omniauth['provider'] : provider = ''
    omniauth['info']['image'] ? image = omniauth['info']['image'] : image = ''
like image 39
Emile Avatar answered Jan 31 '23 10:01

Emile