能否从Google的id_token中获取个人资料信息?

24
当使用谷歌的OpenIDConnect身份验证系统时,可以在scope参数中指定emailprofile或两者都包括。如果您请求email范围,则“电子邮件”和“email_verified”声明将包含在成功的OAuth2身份验证会话的一部分返回的id_token中。
以下是一个例子来自谷歌文档:

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 的内容没有任何影响。为了检索个人资料信息,您必须进行单独的 HTTP 请求到不同的端点(使用刚收到的 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
}

理想情况下,我希望获得个人资料信息(仅为name)包含在id_token JWT中,而不必进行单独的调用。是否有办法指定其他字段并将它们作为声明包含在id_token中?如果没有,为什么email会被特殊处理并返回到id_token中?
3个回答

17

从今天起,在令牌端点(即使用“代码流”)交换代码时,您将获得个人资料信息。

如何使用:在请求中添加profile范围,并确保您正在使用符合OpenID Connect标准的端点(列在https://accounts.google.com/.well-known/openid-configuration中)。

在这些ID令牌响应中查找诸如namepicture之类的声明。与以往一样,如果您的请求中包含email范围,则ID令牌将包含与电子邮件相关的声明。

当您刷新访问令牌时,每隔一段时间返回的带有新访问令牌的ID令牌也将包含这些附加声明。您可以检查这些字段,如果存在(并且与您存储的不同),则更新您用户的个人资料。这对于检测姓名或电子邮件地址更改非常有用。


3
理论上这应该可行,然而我收到的身份标识令牌不包含任何个人资料信息。授权 URI:https://accounts.google.com/o/oauth2/auth?access_type=offline&client_id=xxxxxx&redirect_uri=xxxxx&response_type=code&scope=profile%20email身份标识令牌关键字:["azp", "aud", "sub", "email", "email_verified", "at_hash", "iss", "iat", "exp"] - Alexander Popov
2
@Willam Denniss:由于某种原因,在刷新访问令牌期间,id_token不包含任何个人资料信息。 - Pablo
1
使用URL https://www.googleapis.com/oauth2/v4/token可以正常工作,谢谢。 - Horcrux7
2
这个功能似乎出了问题。使用答案中提供的端点请求ID令牌时,不包含图片或名称声明。并且使用@Horcrux7建议的令牌URL也无法正常工作。 - dmur
你解决了这个问题吗,玛丽亚?我自己也在苦苦挣扎。 - agusterodin
显示剩余3条评论

7
当使用response_type=id_token和范围中的个人资料,如scope=openid+profile+email进行请求时,生成的id token应该直接包含个人资料声明。
这是根据OpenID Connect规范的第5.4节,其中写道:“...当不发出访问令牌(这是response_typeid_token的情况)时,返回的声明将在ID Token中返回。”
然而,在我使用他们的OAuth 2 Playground进行测试时,即使response_type=id_token并且未发出访问令牌,Google似乎也没有将个人资料声明放入id token中。我认为这是Google实现缺陷的问题,除非他们修复了这个问题(或添加了对{{link3:“claims”请求参数}}的支持),否则似乎没有办法实现您要查找的内容。

我至少感谢确认。你是否知道是否有任何地方可以向Google请求OpenIDConnect错误修复/增强功能? - bjmc
我不知道。但我会向一些可能比我更了解的人礼貌地询问。 - Brian Campbell
1
我被告知OpenID Connect没有一个公开的错误跟踪器或类似的东西,但他们正在评估在id token中添加更多声明,并将在此过程中查看特定的response_type=id_token情况(其中没有访问令牌)。虽然他们不能承诺实际完成的时间,但至少他们已经意识到了。这是我能做到的最好的解释。 - Brian Campbell
谢谢,非常感谢! - bjmc
对于仍在寻找解决方法/变通方法的人,按照该回答所建议的将OpenID添加到作用域中即可解决问题。范围文件和电子邮件实际上是用户信息(userinfo)范围而不是令牌信息(tokeninfo)范围,与文档所说有些不同。 - Jeet Kumar

1

好的,这是请求的正确位置。我们正在努力支持此功能,并将很快推出(在接下来的几周内)。届时我会更新此回复。


有更新吗?我正在尝试让它工作,当我没有要求电子邮件时,我看到了电子邮件,但没有像开发者文档中所示的“配置文件对象”。 - jcolebrand
请查看William的回答。我们已经推出了这个功能。您正在请求哪些范围,并且您用于批准的帐户是否具有公开可见名称? - nvnagr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接