我正在使用https://accounts.google.com/o/oauth2/auth?
端点来获取id_token
。
范围是openid profile email
。
问题在于,当我尝试验证id_token
时,我得到了iss, azp, aud, sub, email, email_verified, iat, exp, jti
。如您所见,没有像given_name, family_name, picture
这样的个人资料信息。
official doc说它应该包含个人资料信息:
// These seven fields are only included when the user has granted the "profile" and
// "email" OAuth scopes to the application.
"email": "testuser@gmail.com",
"email_verified": "true",
"name" : "Test User",
"picture": "https://lh4.googleusercontent.com/-kYgzyAWpZzJ/ABCDEFGHI/AAAJKLMNOP/tIXL9Ir44LE/s99-c/photo.jpg",
"given_name": "Test",
"family_name": "User",
"locale": "en"
所有权限均被授予。
更新
以防万一有人需要它。
如 Vladimir Serykh 所述,要获取个人资料信息,我们需要点击/userinfo
端点。但是此端点在access_token
标头中将Authorization
作为Bearer令牌,因此您也需要获取它。
因此,基本上,我们需要使用response_type='id_token token'
查询参数来调用OAuth2。之后,responseUrl也将包含access_token
。
接下来,您只需要调用Authorization标头设置为https://openidconnect.googleapis.com/v1/userinfo
的{{1}}端点即可。您会收到有关个人资料信息的回复:
Bearer your_access_token
再次感谢您, Vladimir Serykh
答案 0 :(得分:1)
(您提供的link提供的文档有多旧,是否与您的案情有关还不清楚)。
我知道不同的身份提供者可以工作的略有不同。而且我知道您应该单独使用获取的ID令牌到/userinfo
端点进行调用以获取用户信息的情况。
Google身份平台有一些不同的Google文档。
它具有 ID令牌的描述。
https://developers.google.com/identity/protocols/OpenIDConnect#obtainuserinfo
Google ID令牌可能包含以下字段(称为声明):
请注意,已提供列中没有always
。我认为不同的API可能会有所不同。
同一文档的“ 获得用户个人资料信息”部分
它说明了在何处获取/userinfo
端点URL以及如何调用它。在回复中,您应该会收到所需的信息。
我猜为什么在您的情况下不起作用是因为您使用的是/tokeninfo
端点。它不是OpenID Connect标准的一部分。它只是验证令牌并对其进行解析(与https://jwt.io做相同的工作)。出于某种原因,原始ID令牌不包含该声明。因此,/tokeninfo
端点不会将它们退还给您。
但是根据Google的文档,您应该使用/userinfo
端点来获取用户信息声明。
您可以在OpenID Connect规范中找到此端点的描述: https://openid.net/specs/openid-connect-core-1_0.html#UserInfo
5.3 UserInfo端点
UserInfo端点是OAuth 2.0受保护的资源,它返回有关经过身份验证的最终用户的声明。为了获得所请求的有关最终用户的声明,客户端使用通过OpenID Connect身份验证获得的访问令牌向UserInfo端点发出请求。