Ben Scheirman
Ben Scheirman

Reputation: 40961

Retrieve OpenID AX attributes from Google / Yahoo in Rails

I'm using the rails plugin open_id_authentication in my app. This works for MyOpenID, however authenticating with Google I can't get the email address as part of the required attributes.

From what I understand, Google ignores sreg attribute requests, and only listens to the AX schema for email address.

Here's my code:

     def open_id_authentication(openid_url)

       #google only responds to AX for email, so we must provide that also
       authenticate_with_open_id(openid_url, :required => [:nickname, :email, 'http://axschema.org/contact/email']) do |result, identity_url, registration|
        if result.successful?    
         @user = User.find_or_initialize_by_identity_url(identity_url)
         if @user.new_record?            
             unless registration['email'] || registration['http://axschema.org/contact/email']          
                 failed_login "Your OpenID provider didn't send us an email address."
                 return
              end

          #some providers (like Google) won't send a nick name.  We'll use email instead for those
          nick = registration['nickname']
          nick |= registration['email']
          nick |= registration['http://axschema.org/contact/email']

          email = registration['email'];
          email |= registration['http://axschema.org/contact/email']

          @user.login = nick
          @user.email = email
          @user.save(false)
     end
     self.current_user = @user
     successful_login
    else
       failed_login result.message
    end
   end

My understanding is that I submit the email address (both sreg and AX) as required and I should be able to pull them out of the registration instance that is passed along with the response.

When I log in with Google the email address is passed back as 't'.

Am I handling this incorrectly? How can I get the user's email address from Google? Will I have to jump through any other hoops to support Yahoo?

Upvotes: 4

Views: 4702

Answers (4)

Peter Hudec
Peter Hudec

Reputation: 2483

For me it still didn't work with http://schema.openid.net/contact/email but found out here https://groups.google.com/forum/?fromgroups=#!topic/google-federated-login-api/dOrQ8Ho5BGI that it must be openid.ax.required and that worked.

Upvotes: 0

Sean Hill
Sean Hill

Reputation: 15056

As another poster has already mentioned, Google responds to the AX schema for e-mail now. I know that this post was written a while ago, but Google still does not respond to namePerson. However, they do provide:

http://axschema.org/namePerson/first 
http://axschema.org/namePerson/last

Therefore, to answer Shripad K's question above, you could do, using the code above as an example:

name = [
        registration['http://axschema.org/namePerson/first'],
        registration['http://axschema.org/namePerson/last']
       ].join(" ")

Upvotes: 2

Ben Scheirman
Ben Scheirman

Reputation: 40961

I ended up solving this one myself. It wasn't easy finding official docs on which AX schema URLs are supported.

Here's what I found:

Google will respond only to email address using the AX schema: http://schema.openid.net/contact/email

Yahoo will respond to alias & email using these AX schemas:

http://axschema.org/namePerson/friendly
http://axschema.org/contact/email

So I need to request basically all of the known AX schema URLs for email address and hope the provider sends it. /shrug

Upvotes: 7

Andrew Arnott
Andrew Arnott

Reputation: 81791

I don't know the Ruby OpenID library you're using very well, but it looks like you're trying to use AX by mixing its attribute Type URIs into the Simple Registration extension, which is a very different beast. You should (since I don't know it by heart) check out the docs or samples for OpenID use with the library you're using for AX specifically and make sure you're following the right steps. Google only supports AX, whereas Yahoo supports Simple Registration (I'm not sure if Yahoo also supports AX at this point).

Upvotes: 1

Related Questions