是否可以从 Google 获取 id_token 中的配置文件信息?

Is it possible to get profile information in an id_token from Google?

使用 Google 的 OpenIDConnect 身份验证系统时,可以在 scope 参数中指定 emailprofile 或两者。如果您请求 email 范围,"email" 和 "email_verified" 声明将包含在作为成功的 OAuth2 身份验证会话的一部分返回的 id_token 中。

这是一个例子from Google's documentation:

An ID token's payload

An ID token is a JSON object containing a set of name/value pairs. Here’s an example, formatted for readability:

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

当使用 response_type=id_tokenscope=openid+profile+email 范围内的个人资料发出请求时,生成的 ID 令牌应直接包含个人资料声明。

这是根据 section 5.4 of the OpenID Connect spec,它说“...当没有颁发访问令牌时(response_typeid_token 就是这种情况),生成的声明是在 ID 令牌中返回。”

但是,在我对他们的 OAuth 2 Playground, Google doesn't seem to put profile claims in the id token even when response_type=id_token and no access token is issued. I'd argue that this is an implementation defect on Google's part and, short of them fixing that (or adding support for the "claims" Request Parameter) 进行的小测试中,似乎没有办法实现您正在寻找的东西。

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

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

如何使用:profile 范围添加到您的请求中,并确保您使用的是 OpenID Connect 兼容端点([=14 中列出的端点) =]).

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

当您刷新访问令牌时,与新访问令牌一起返回的 ID 令牌通常也会包含这些额外的声明。您可以检查这些字段,如果存在(并且与您存储的不同),请更新您的用户资料。这对于检测姓名或电子邮件地址更改很有用。