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
端点去弃用(见说明),并应提供的信息假设
https://developers.google.com/identity/sign-in/web/devconsole-project
范围和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的权威来源.
所以,要明确:
无论如何,任何事物的加号版本(如下所述)都已弃用并计划删除.
原始答案
这里有很多问题,你在做什么,以及你是如何做到这一点的.
对于初学者,https://www.googleapis.com/oauth2/v2/userinfo
端点已弃用,并计划在2014年9月删除.它已开始工作不一致 - 所以不要使用它.
正如@abraham所说,你将使用people.get端点https://www.googleapis.com/plus/v1/people/me
.这应该为您提供包含地址数组的电子邮件字段.在您的情况下,可能只有一种具有"帐户"类型.
tur*_*ula 44
截至2017年:使用email
范围.请参阅授权API请求.
此电子邮件范围等同于并取代了 https://www.googleapis.com/auth/userinfo.email范围.
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
要检索电子邮件地址,您需要包含本文档中提到的范围:“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)
我来到这里看看为什么我的服务器没有收到电子邮件以响应/ oauth2/v2/userinfo api调用.只有一次,我看到了它,它在过去一直运作良好.
答案很好.在解决这个问题的同时,还有其他一些资源有所帮助.我仍然不确定是否期望总是在回复中发送电子邮件是好的.所以 - 如果没有返回电子邮件,请将错误处理放在代码中.
小智 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
通过使用谷歌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)