获取用户电子邮件地址的Google OAuth API?

时间:2014-06-27 01:24:39

标签: email oauth google-plus google-oauth

我正在使用我自己的个人Google帐户玩Google的OAuth 2.0 Playground,但我似乎无法使用游乐场恢复我的Gmail地址。

我使用的范围是:

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

但是当我打电话给API时:

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

我收到有关用户的各种信息,如姓氏,名字,性别,图片等,但不会返回用户的电子邮件。

如何检索用户的电子邮件地址?我是否有错误的范围或我是否使用了错误的API?我觉得这应该很简单,但我确实试图解决这个问题几个小时,我找不到一直提供用户电子邮件地址的API和范围组合。

12 个答案:

答案 0 :(得分:52)

更新:2018年12月

12月20日,Google宣布将于2019年3月关闭Google+ API,从2019年1月底开始出现间歇性故障。作为的一部分,plus.people.get端点已弃用并已安排被终止

userinfo端点已弃用(请参阅说明)并应提供信息假设

  1. 您请求https://developers.google.com/identity/sign-in/web/devconsole-project范围和
  2. 您请求email字段。
  3. 澄清:2019年1月24日

    Google documented,不推荐使用userinfo(v2)端点,但稍后将其更改为“已弃用,但仍可用于向后兼容”。

    Current documentation讨论了通过当前支持的openid方法获取个人资料和电子邮件信息。这包括使用OpenID Connect要求的discovery document中指定的“userinfo”端点。

    目前,该网址为https://openidconnect.googleapis.com/v1/userinfo,但过去发生了变化,https://accounts.google.com/.well-known/openid-configuration的发现文档是要使用的网址的权威来源。

    所以,要明确:

    • 维护旧的userinfo URL以实现向后兼容性
    • 发现文档
    • 中提供了新的userinfo URL

    无论如何,任何事物的加号版本(如下所述)都是deprecated and scheduled to be removed

    原始答案

    这里有很多问题,你在做什么以及你是如何做的。

    首先,https://www.googleapis.com/oauth2/v2/userinfo端点已弃用,并计划于2014年9月删除。它已开始工作不一致 - 所以请勿使用它。

    正如@abraham所说,你将在https://www.googleapis.com/plus/v1/people/me使用people.get端点。这应该为您提供包含地址数组的emails字段。在您的情况下,可能只有一种类型为“帐户”。

答案 1 :(得分:42)

截至2017年:使用email范围。请参阅Authorizing API requests

  

电子邮件范围相当于并取代了   https://www.googleapis.com/auth/userinfo.email范围。

enter image description here

答案 2 :(得分:12)

您希望添加https://www.googleapis.com/auth/userinfo.email范围或将https://www.googleapis.com/oauth2/v2/userinfo替换为<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> 。如果您正在使用它们提供的HTML示例,则可以列出以空格分隔的多个范围。

{{1}}

答案 3 :(得分:6)

我来到这里看看为什么我的服务器没有收到电子邮件以响应/ oauth2 / v2 / userinfo api调用。我只看过一次&amp;它过去一直运作良好。

答案很好。在解决这个问题的同时,还有其他一些资源有所帮助。我仍然不确定是否期望总是在回复中发送电子邮件。所以 - 如果没有返回电子邮件,请将错误处理放在代码中。

  1. 关于migrating to google+ signin的Google api文档。
  2. https://www.googleapis.com/auth/userinfo.email scope
  3. 人力资源documentation
  4. 使用google developer console将google + api添加到项目中。免费(配额)通话费用相当高(每天20分钟为google + signin api)。
  5. 添加错误处理&amp;登录服务器代码以防api不返回任何电子邮件。在我的情况下,我只看了type ='account'电子邮件。

答案 4 :(得分:3)

使用OAuth 2.0使用Google登录时,无需另外请求获取用户的电子邮件。

Google调用回调URL时,它将在查询字符串中提供一个code,可用于交换访问令牌和ID令牌。 ID令牌是一个JWT,其中包含有关用户的身份信息,其中包括电子邮件地址。

在此处查看更多信息:https://developers.google.com/identity/protocols/OpenIDConnect

答案 5 :(得分:3)

要检索电子邮件地址,您需要包括以下范围:“ https://www.googleapis.com/auth/userinfo.email”,如本文档中所述。如果在生成刷新令牌时包含此范围,则应该能够通过发出以下请求来获取身份验证用户的电子邮件地址:

您可以使用自己的访问令牌进行调用,然后给出响应

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

响应看起来像这样

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

或者只是您可以编写一个函数

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()

答案 6 :(得分:2)

这实际上是一个挑战,因为Google默认情况下不提供电子邮件。您必须明确要求Google Plus。

const scope = [
  'https://www.googleapis.com/auth/plus.me', // request access here
  'https://www.googleapis.com/auth/userinfo.email',
];

auth.generateAuthUrl({
  access_type: 'offline',
  prompt: 'consent',
  scope: scope,
});

const plus = google.plus({ version: 'v1', auth });
const me = await plus.people.get({ userId: 'me' });
const userEmail = me.data.emails[0].value;

我写的这篇博客文章有完整版本:https://medium.com/@jackscott/how-to-use-google-auth-api-with-node-js-888304f7e3a0

答案 7 :(得分:1)

我一直在关注囚犯在上面的回答,这对我有所帮助...直到我收到Google Developers的电子邮件,有关如何在2019年3月7日关闭Google+ API的情况。

我四处寻找,并找到了此解决方案来使用id_token来获取电子邮件,当您在开发者控制台上使用email范围授权应用时,会返回该电子邮件。

来自Google Sign-in for Websites

  

要在PHP中验证ID令牌,请使用Google API客户端库   PHP。安装库(例如,使用Composer):

     

composer require google/apiclient

     

然后,调用verifyIdToken()函数。例如:

require_once 'vendor/autoload.php';

// Get $id_token via HTTPS POST.

$client = new Google_Client(['client_id' => $CLIENT_ID]);  // Specify the CLIENT_ID of the app that accesses the backend
$payload = $client->verifyIdToken($id_token);
if ($payload) {
  $userid = $payload['sub'];
  // If request specified a G Suite domain:
  //$domain = $payload['hd'];
} else {
  // Invalid ID token
}

这将返回一个包含用户信息的数组,该数组还包含登录用户的电子邮件。希望对其他人有帮助。

答案 8 :(得分:1)

请在这里查看我对相同问题的回答: how to get email after using google OAuth2 in C#?

  • 在您的 scopes 变量中。使用值“电子邮件”而不是 完整的https地址。 Web链接中的范围关键字用空格分隔。我用以下范围来解决您的问题:个人资料电子邮件openid

答案 9 :(得分:0)

https://developers.google.com/gmail/api/v1/reference/users/getProfile

对于gmails api,将其添加到nodejs代码:

function getUsersEmail (auth) {
  const gmail = google.gmail({version: 'v1', auth})
  gmail.users.getProfile({
    userId: 'me'
  }, (err, {data}) => {
    if (err) return console.log('The API returned an error: ' + err)
    console.log(data.emailAddress)
  })
}

Gmails api:https://developers.google.com/gmail/api/guides/

答案 10 :(得分:0)

使用给定范围authorizationRequest更改scope=openid%20email%20profile并使用userinfoapi。 This link worked for me

答案 11 :(得分:0)

通过使用 google nodejs sdk

const {google} = require('googleapis');
const people = google.people({
      version: "v1",
      auth: oauth2Client,
    });

const resGoogle = await people.people.get({
      resourceName: "people/me",
      personFields: "emailAddresses,names,photos",
    });

sample code