Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there a way to get your email address after authenticating with Gmail using Oauth?

In a Python web application, I am able to connect to Gmail using OAuth and IMAP. OAuth uses whichever Google account you're currently signed into simply and asks you to grant access to the web app. However, it doesn't provide an API to actually retrieve that account's email address.

The problem is, even though the user grants access with OAuth, to interface with Gmail, you still need to explicitly provide the email address in your IMAP connection URL:

https://mail.google.com/mail/b/[your-email]/imap/

Because of this, the web application has to ask the user for their email address and ask them to grant access from Gmail with OAuth. What's worse is the email address they enter may not match the email of the account they grant access with, causing the app to fail.

Is there a way to get your email address using OAuth so you can put it in that URL without asking the user for it? I tried looking at this answer but Google returns a Bad Request whenever I use both https://mail.google.com/ and https://www.googleapis.com/auth/userinfo#email as my scope.

like image 568
Joe Avatar asked Aug 07 '11 04:08

Joe


People also ask

How does OAuth Gmail work?

All requests to the Gmail API must be authorized by an authenticated user. Gmail uses the OAuth 2.0 protocol for authenticating a Google account and authorizing access to user data. You can also use Google Sign-in to provide a "sign-in with Google" authentication method for your app.


2 Answers

What you're after is the Google Contacts API. If you're authorizing via OAuth you're probably currently asking for permission to access the gmail scope:

https://mail.google.com/mail/feed/atom

You will also need to ask for permission for the contacts scope:

https://www.google.com/m8/feeds/

Once you have that, you can make a GET request similar to the following:

https://www.google.com/m8/feeds/contacts/default/full?max-results=1

This should return a bunch of xml, here are some relevant bits:

<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:gContact="http://schemas.google.com/contact/2008" xmlns:batch="http://schemas.google.com/gdata/batch" xmlns:gd="http://schemas.google.com/g/2005" gd:etag="W/&quot;CEcMRX0_eCp7ImA9WhdRF00.&quot;">
<id>[email protected]</id>
...
<author>
  <name>Joe Bloggs</name>
  <email>[email protected]</email>
</author>
...
</feed>

As you can see you can find the authorized users' email in a couple of places.

If you're using OAuth you might also want to have a look at the Google OAuth playground, I've found it very handy: http://googlecodesamples.com/oauth_playground/index.php. If you decide to use OAuth2 there is equivalent tool at https://code.google.com/oauthplayground

like image 129
skorks Avatar answered Sep 25 '22 20:09

skorks


skorks answer works just fine but you should use the correct API. By adding additional scope of

https://www.googleapis.com/auth/userinfo.email

You do it "the right way"!

I wrote a complete article about this with example code: http://www.hackviking.com/2013/10/python-get-user-info-after-oauth/ Code available here: https://code.google.com/p/google-api-oauth-demo/

like image 42
Kristofer Källsbo Avatar answered Sep 24 '22 20:09

Kristofer Källsbo