问题 是否可以通过Google的id_token获取个人资料信息?


使用Google的OpenIDConnect身份验证系统时,可以指定 email 要么 profile 或两者兼而有之 scope 参数。如果你要求的话 email 范围,“电子邮件”和“email_verified”声明将包含在 id_token 作为成功的OAuth2身份验证会话的一部分返回。

这是一个例子 来自Google的文档:

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中返回?


4357
now


起源



答案:


从今天开始,您将在令牌端点交换代码时获取配置文件信息(即使用“代码流”)。

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

寻找诸如此类的主张 name 和 picture 在这些ID令牌响应中。和以前一样,如果 email 范围在您的请求中,ID令牌将包含与电子邮件相关的声明。

刷新访问令牌时,使用全新访问令牌返回的ID令牌通常也会包含这些附加声明。您可以检查这些字段,如果存在(并且与您存储的内容不同),请更新用户的个人资料。这对于检测名称或电子邮件地址更改非常有用。


9
2017-09-04 21:05



理论上这应该有效,但是,我收到的id令牌不包含任何个人资料信息。 authorization_uri: accounts.google.com/o/oauth2/...  id令牌键:[“azp”,“aud”,“sub”,“email”,“email_verified”,“at_hash”,“iss”,“iat”,“exp”] - Alex Popov
@Willam Denniss:由于某些原因,在刷新访问令牌时,id_token不包含任何个人资料信息。 - Pablo
使用URL googleapis.com/oauth2/v4/token 它有效,谢谢。 - Horcrux7


答案:


从今天开始,您将在令牌端点交换代码时获取配置文件信息(即使用“代码流”)。

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

寻找诸如此类的主张 name 和 picture 在这些ID令牌响应中。和以前一样,如果 email 范围在您的请求中,ID令牌将包含与电子邮件相关的声明。

刷新访问令牌时,使用全新访问令牌返回的ID令牌通常也会包含这些附加声明。您可以检查这些字段,如果存在(并且与您存储的内容不同),请更新用户的个人资料。这对于检测名称或电子邮件地址更改非常有用。


9
2017-09-04 21:05



理论上这应该有效,但是,我收到的id令牌不包含任何个人资料信息。 authorization_uri: accounts.google.com/o/oauth2/...  id令牌键:[“azp”,“aud”,“sub”,“email”,“email_verified”,“at_hash”,“iss”,“iat”,“exp”] - Alex Popov
@Willam Denniss:由于某些原因,在刷新访问令牌时,id_token不包含任何个人资料信息。 - Pablo
使用URL googleapis.com/oauth2/v4/token 它有效,谢谢。 - Horcrux7


当提出请求时 response_type=id_token 和范围内的配置文件 scope=openid+profile+email,生成的id令牌应直接包含配置文件声明。

这是每个 OpenID Connect规范的第5.4节,表示“......当没有发出访问令牌时(就是这种情况) response_type 值 id_token),产生的索赔在ID令牌中返回。“

然而,在一点点测试中我做了他们的 OAuth 2游乐场,Google似乎没有将个人资料声明放在id令牌中 response_type=id_token 并且没有发出访问令牌。我认为这是谷歌的一个实施缺陷,而不是他们修复它(或添加支持 “声明”请求参数),似