Google OAuth API to get user's email address?
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
- You request the
https://developers.google.com/identity/sign-in/web/devconsole-project
scope and - 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".
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.
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>