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

Rev*_*ech 55 email oauth google-plus google-oauth

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

我使用的范围是:

email profile https://www.googleapis.com/auth/plus.login
Run Code Online (Sandbox Code Playgroud)

但是当我调用API时:

https://www.googleapis.com/oauth2/v2/userinfo
Run Code Online (Sandbox Code Playgroud)

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

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

Pri*_*ner 57

更新:2018年12月

12月20日,谷歌宣布了Google+ API将在2019年三月被拒绝,起价为2019年一月底由于部分间歇性故障plus.people.get端点被取消或计划被终止.

userinfo端点去弃用(见说明),并应提供的信息假设

  1. 您请求https://developers.google.com/identity/sign-in/web/devconsole-project范围和
  2. 你请求该email字段.

澄清:2019年1月24日

Google 记录了不推荐使用userinfo(v2)端点,但后来将其更改为"已弃用,但仍然可用于向后兼容".

当前文档讨论通过当前支持的openid方法获取配置文件和电子邮件信息 这包括使用OpenID Connect要求的发现文档中指定的"userinfo"端点.

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

所以,要明确:

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

无论如何,任何事物的加号版本(如下所述)都已弃用并计划删除.

原始答案

这里有很多问题,你在做什么,以及你是如何做到这一点的.

对于初学者,https://www.googleapis.com/oauth2/v2/userinfo端点已弃用,并计划在2014年9月删除.它已开始工作不一致 - 所以不要使用它.

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

  • 我想知道OAuth2 userinfo API是否真的已被弃用,因为它仍然存在于[示波器文档](https://developers.google.com/identity/protocols/googlescopes),API资源管理器和OAuth 2.0游乐场中.但它在开发人员控制台中不可用. (5认同)

tur*_*ula 44

截至2017年:使用email范围.请参阅授权API请求.

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

在此输入图像描述

  • 谢谢.很高兴看到一些变化的最新答案:) (3认同)

Tom*_*Tom 13

您需要添加https://www.googleapis.com/auth/userinfo.email范围或替换https://www.googleapis.com/oauth2/v2/userinfo它.如果您使用的是他们提供的HTML示例,则可以列出由空格分隔的多个范围.

<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>
Run Code Online (Sandbox Code Playgroud)


Che*_*ang 11

要使用 OAuth 2.0 登录 Google,无需单独请求获取用户的电子邮件。

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

在此处查看更多信息:https : //developers.google.com/identity/protocols/oauth2/openid-connect

  • 事实上这是正确的。idToken 与访问或刷新令牌不同,它包含易于提取的嵌入信息。不过,在 Google 的情况下,范围确实需要包含“openid email”,以便电子邮件地址出现在 idToken 中。https://developers.google.com/identity/protocols/oauth2/openid-connect#obtainuserinfo (2认同)

kn3*_*n3l 7

要检索电子邮件地址,您需要包含本文档中提到的范围:“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"
}
Run Code Online (Sandbox Code Playgroud)

或者干脆你可以只写一个函数

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()
Run Code Online (Sandbox Code Playgroud)


Sus*_*hil 6

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

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

  1. 有关迁移到Google +登录的 Google API文档.
  2. https://www.googleapis.com/auth/userinfo.email范围
  3. 人力资源文档
  4. 使用google开发者控制台将google + api添加到项目中.免费(配额)通话费用相当高(每天20分钟为google + signin api).
  5. 如果api没有返回电子邮件,请添加错误处理和登录服务器代码.在我的情况下,我只看了type ='account'电子邮件.


小智 5

这实际上是一个挑战,因为谷歌默认不提供电子邮件。您必须向 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;
Run Code Online (Sandbox Code Playgroud)

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


Jer*_*yal 5

通过使用谷歌nodejs sdk

const {google} = require('googleapis');

const oauth2Client = new google.auth.OAuth2(
      googleClientIdPublic,
      googleClientSecret,
      googleRedirectUriPublic
    );

//scope you need: https://www.googleapis.com/auth/userinfo.email

oauth2Client.setCredentials(tokens);

const googleAuth = google.oauth2({
      version: "v2",
      auth: oauth2Client,
    });

const googleUserInfo = await googleAuth.userinfo.get();
const email = googleUserInfo.data.email;
Run Code Online (Sandbox Code Playgroud)

更多信息