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

bjm*_*jmc 14 google-openid oauth-2.0 openid-connect google-oauth2

当使用谷歌的OpenIDConnect认证系统,它可以指定emailprofile或两者的scope参数.如果您请求email范围,则"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" 
}
Run Code Online (Sandbox Code Playgroud)

但是,请求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
}
Run Code Online (Sandbox Code Playgroud)

理想情况下,我更愿意获取nameid_token JWT中包含的配置文件信息(只是,实际上),而不是必须单独调用.有没有办法指定其他字段并将它们作为声明包含在id_token中?如果没有,为什么要email特别处理并返回id_token?

Wil*_*iss 11

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

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

寻找索赔,如namepicture这些ID令牌响应.和以前一样,如果email范围在您的请求中,则ID令牌将包含与电子邮件相关的声明.

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

  • 理论上这应该有效,但是,我收到的id令牌不包含任何配置文件信息.authorization_uri:https://accounts.google.com/o/oauth2/auth?access_type=offline&client_id=xxxxxx&redirect_uri=xxxxx&response_type=code&scope=profile%20email id令牌密钥:["azp","aud","sub","email" ","email_verified","at_hash","iss","iat","exp"] (3认同)
  • @Willam Denniss:由于某种原因,在刷新访问令牌期间 id_token 不包含任何配置文件信息。 (2认同)
  • 此功能似乎已损坏。使用答案中链接的端点进行请求时,ID令牌不包含图片或名称声明。它也不适用于建议使用的令牌URL @ Horcrux7。 (2认同)

Bri*_*ell 6

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

这是根据OpenID Connect规范的第5.4节,其中说"......当没有发出访问令牌时(这是response_type值的情况id_token),结果声明将在ID令牌中返回."

但是,在我使用OAuth 2 Playground进行的一些测试中,即使response_type=id_token没有发出访问令牌,Google似乎也没有将配置文件声明放在id令牌中.我认为这是Google的一个实现缺陷,如果没有他们修复(或添加对"索赔"请求参数的支持),似乎没有办法完成你正在寻找的东西.