是否可以从 Google 获取 id_token 中的个人资料信息?
Posted
技术标签:
【中文标题】是否可以从 Google 获取 id_token 中的个人资料信息?【英文标题】:Is it possible to get profile information in an id_token from Google? 【发布时间】:2015-11-17 10:56:35 【问题描述】:使用 Google 的 OpenIDConnect 身份验证系统时,可以在 scope
参数中指定 email
或 profile
或同时指定两者。如果您请求 email
范围,“email”和“email_verified”声明将包含在作为成功 OAuth2 身份验证会话的一部分返回的 id_token
中。
这是一个例子from Google's documentation:
ID 令牌的有效负载
ID 令牌是包含一组名称/值对的 JSON 对象。 这是一个示例,为便于阅读而格式化:
"iss":"accounts.google.com",
"at_hash":"HK6E_P6Dh8Y93mRNtsDB1Q",
"email_verified":"true",
"sub":"10769150350006150715113082367",
"azp":"1234987819200.apps.googleusercontent.com",
"email":"jsmith@example.com",
"aud":"1234987819200.apps.googleusercontent.com",
"iat":1353601026,
"exp":1353604926,
"hd":"example.com"
但是,请求profile
范围似乎对 id_token 的内容没有任何影响。为了检索配置文件信息,您必须创建一个separate HTTP request to a distinct endpoint(使用您刚刚收到的 access_token 进行身份验证)以获取看起来非常相似但包含更多信息的文档:
"kind": "plus#personOpenIdConnect",
"gender": string,
"sub": string,
"name": string,
"given_name": string,
"family_name": string,
"profile": string,
"picture": string,
"email": string,
"email_verified": "true",
"locale": string,
"hd": string
理想情况下,我宁愿获取包含在 id_token JWT 中的配置文件信息(实际上只是 name
),而不必进行单独的调用。有没有办法指定其他字段并将它们作为声明包含在 id_token 中?如果不是,为什么email
会被特殊处理并在id_token中返回?
【问题讨论】:
【参考方案1】:从今天开始,您将在令牌端点交换代码时获得个人资料信息(即使用“代码流”)。
如何使用:将profile
范围添加到您的请求中,并确保您使用的是符合OpenID Connect 的端点(https://accounts.google.com/.well-known/openid-configuration 中列出的端点)。
在这些 ID 令牌响应中查找诸如 name
和 picture
之类的声明。和以前一样,如果 email
范围在您的请求中,则 ID 令牌将包含与电子邮件相关的声明。
当您刷新访问令牌时,与新访问令牌一起返回的 ID 令牌时常也会包含这些额外的声明。您可以检查这些字段,如果存在(并且与您存储的不同),请更新您的用户配置文件。这对于检测姓名或电子邮件地址的更改很有用。
【讨论】:
理论上这应该可行,但是,我收到的 id 令牌不包含任何个人资料信息。 authorization_uri:accounts.google.com/o/oauth2/… id 令牌密钥:[“azp”、“aud”、“sub”、“email”、“email_verified”、“at_hash”、“iss”、“iat”、“exp”] @Willam Denniss:出于某种原因,在刷新访问令牌期间,id_token 不包含任何个人资料信息。 使用 URL googleapis.com/oauth2/v4/token 它可以工作,谢谢。 此功能似乎已损坏。当使用答案中链接的端点请求时,ID 令牌不包含图片或名称声明。它也不适用于建议使用的令牌 URL @Horcrux7。 我刚刚开始工作:1. accounts.google.com/o/oauth2/v2/auth 使用我的 client_id、redirect_uri 和 state 和 response_type=code 和 scope=openid+email+profile。 2. oauth2.googleapis.com/token 带有第一次调用返回的代码,我的 client_id 和 client_secret 和 redirect_uri,以及 grant_type=authorization_code。得到一个 id_token 包含 sub、name、given_name、profile、picture、email、email_verified、locale 和 hd——不需要点击 openidconnect.googleapis.com/v1/userinfo【参考方案2】:当使用response_type=id_token
和scope=openid+profile+email
等范围内的配置文件发出请求时,生成的 id 令牌应直接包含配置文件声明。
这是每个section 5.4 of the OpenID Connect spec,它说“......当没有发布访问令牌时(response_type
值id_token
就是这种情况),生成的声明将在 ID 令牌中返回。”
但是,在我对他们的OAuth 2 Playground 进行的一个小测试中,即使response_type=id_token
并且没有颁发访问令牌,Google 似乎也没有将配置文件声明放入 id 令牌中。我认为这是 Google 的一个实现缺陷,如果他们没有解决这个问题(或添加对 "claims" Request Parameter 的支持),似乎没有办法完成你正在寻找的东西。
【讨论】:
我感谢您的确认,至少。我想您不知道是否有任何地方可以向 Google 请求 OpenIDConnect 错误修正/增强功能? 我不知道。但会礼貌地询问一些可能比我更了解的人。 我被告知 OpenID Connect 没有开放的错误跟踪器或类似的东西,但他们正在评估在 id 令牌中放置更多声明并将查看特定的 response_type=id_token 案例(在此过程中没有访问令牌的地方)。尽管他们无法承诺是否或何时实际完成。他们至少知道。这是我能做到的最好的。 谢谢,非常感谢! 对于仍在寻找修复/解决方法的人,按照此答案中的建议在范围内添加 openid 就可以了。范围配置文件和电子邮件实际上是 userinfo 范围而不是 tokeninfo 范围,与文档所说的有点不同【参考方案3】:嗯,这是请求的正确位置。我们正在努力支持此功能,并且应该很快(在接下来的几周内)推出此功能。到时候我会更新这个回复。
【讨论】:
有什么更新吗?试图让这个工作,当我不要求电子邮件时,我看到了电子邮件,但没有开发人员文档中指出的“配置文件对象”。 见威廉的回答。我们确实推出了这个。您请求什么范围?您用于批准的帐户是否有公开可见的名称?以上是关于是否可以从 Google 获取 id_token 中的个人资料信息?的主要内容,如果未能解决你的问题,请参考以下文章
是否可以使用 Chrome App Indentity Api 获取 Id 令牌?
如何使用 id_token 从 Azure Function 应用程序获取 Azure access_token?
Python 如何从使用 oauthlib 的帐户身份验证获取 ID_Token 以与 Open ID Connect 一起使用