Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Google OAuth API to get user's email address?

I am playing with Google's OAuth 2.0 Playground using my own personal Google account, but I cannot seem to recover my Gmail address using the playground.

The scope I am using is:

email profile https://www.googleapis.com/auth/plus.login

But when I call the API:

https://www.googleapis.com/oauth2/v2/userinfo

I get various information about the user such as family name, first name, gender, picture, etc. but it does not return the user's email.

How do I retrieve the user's email address? Do I have the wrong scope or am I calling the wrong API? I feel like this should be very simple but I have literally been trying to figure this out for hours and I cannot find an API and scope combination that consistently provides the user's email address.

like image 480
RevolutionTech Avatar asked Jun 27 '14 01:06

RevolutionTech


5 Answers

Update: December 2018

On December 20th, Google announced that the Google+ API would be turned down in March 2019, with intermittent failure starting at the end of January 2019. As part of the the plus.people.get endpoint is deprecated and scheduled to be terminated.

The userinfo endpoint is de-deprecated (see clarification) and should provide the info assuming

  1. You request the https://developers.google.com/identity/sign-in/web/devconsole-project scope and
  2. You request the email field.

Clarification: 24 Jan 2019

Google documented that the userinfo (v2) endpoint was deprecated, but later changed it to "deprecated, but kept available for backwards compatibility".

Current documentation discusses getting profile and email information through the currently supported openid method. This includes using the "userinfo" endpoint specified in their discovery document, as required by OpenID Connect.

At the moment, that URL is https://openidconnect.googleapis.com/v1/userinfo, but this has changed in the past and the discovery document at https://accounts.google.com/.well-known/openid-configuration is the authoritative source for the URL to use.

So, to be clear:

  • The old userinfo URL is maintained for backwards compatibility
  • The new userinfo URL is available at the discovery document

Regardless, the plus version of anything (described below) is deprecated and scheduled to be removed.

Original Answer

There are a lot of issues here in what you're doing and how you're trying to do it.

For starters, the https://www.googleapis.com/oauth2/v2/userinfo endpoint is deprecated, and scheduled to be removed in September 2014. It has begun working inconsistently - so don't use it.

As @abraham noted, you'll use the people.get endpoint at https://www.googleapis.com/plus/v1/people/me. This should give you the emails field containing an array of addresses. In your case, there will likely be only one that has a type of "account".

like image 163
Prisoner Avatar answered Oct 23 '22 22:10

Prisoner


As of 2017: use the email scope. See Authorizing API requests.

This email scope is equivalent to and replaces the https://www.googleapis.com/auth/userinfo.email scope.

enter image description here

like image 28
turdus-merula Avatar answered Oct 24 '22 00:10

turdus-merula


For signing in with Google using OAuth 2.0, there's no need to make a separate request to get user's email.

When Google calls the callback URL, it provides a code in the query string that you could use to exchange for access token and ID token. The ID token is a JWT that contains identity information about the user, which includes the email address.

See more information here: https://developers.google.com/identity/protocols/oauth2/openid-connect

like image 15
Chen Pang Avatar answered Oct 23 '22 23:10

Chen Pang


You'll want to add the https://www.googleapis.com/auth/userinfo.email scope or replace https://www.googleapis.com/oauth2/v2/userinfo with it. If you're using the HTML example they provide, you can list multiple scopes separated by a space.

<span
  class="g-signin"
  data-callback="signInCallback"
  data-clientid="{{ plus_id }}"
  data-cookiepolicy="single_host_origin"
  data-requestvisibleactions="http://schemas.google.com/AddActivity"
  data-scope="https://www.googleapis.com/auth/plus.login   
  https://www.googleapis.com/auth/userinfo.email">
</span>
like image 14
Tom Avatar answered Oct 23 '22 22:10

Tom


To retrieve the email address, you need to include the scope: "https://www.googleapis.com/auth/userinfo.email" as mentioned in this document. If this scope is included while you generate the refresh token, you should be able to get the email address of the authenticating user by making the following request:

you can call this with your own access token then will give the response

https://www.googleapis.com/oauth2/v3/userinfo?access_token="YOUR_ACCESS_TOKEN"

response will look like this

{
  "sub": "1057abc98136861333615xz",
  "name": "My Name",
  "given_name": "My",
  "family_name": "Name",
  "picture": "https://lh3.googleusercontent.com/a-/AOh14qiJarwP9rRw7IzxO40anYi4pTTAU_xseuRPFeeYFg",
  "email": "[email protected]",
  "email_verified": true,
  "locale": "en"
}

or simply you can just write a function

import requests
def get_user_email(access_token):
    r = requests.get(
            'https://www.googleapis.com/oauth2/v3/userinfo',
            params={'access_token': access_token})
    return r.json()
like image 9
kn3l Avatar answered Oct 23 '22 23:10

kn3l