我正在使用我自己的个人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和范围组合。
答案 0 :(得分:52)
更新:2018年12月
12月20日,Google宣布将于2019年3月关闭Google+ API,从2019年1月底开始出现间歇性故障。作为的一部分,plus.people.get
端点已弃用并已安排被终止。
userinfo
端点已弃用(请参阅说明)并应提供信息假设
https://developers.google.com/identity/sign-in/web/devconsole-project
范围和email
字段。澄清: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
的发现文档是要使用的网址的权威来源。
所以,要明确:
无论如何,任何事物的加号版本(如下所述)都是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范围。
答案 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;它过去一直运作良好。
答案很好。在解决这个问题的同时,还有其他一些资源有所帮助。我仍然不确定是否期望总是在回复中发送电子邮件。所以 - 如果没有返回电子邮件,请将错误处理放在代码中。
答案 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#?
答案 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)
})
}
答案 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",
});