Google OAuth2无法获取个人资料信息

时间:2019-12-03 21:19:42

标签: node.js oauth-2.0 openid

我正在使用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

1 个答案:

答案 0 :(得分:1)

(您提供的link提供的文档有多旧,是否与您的案情有关还不清楚)。

我知道不同的身份提供者可以工作的略有不同。而且我知道您应该单独使用获取的ID令牌到/userinfo端点进行调用以获取用户信息的情况。


Google身份平台有一些不同的Google文档。

  1. 它具有 ID令牌的描述。

    https://developers.google.com/identity/protocols/OpenIDConnect#obtainuserinfo

      

    Google ID令牌可能包含以下字段(称为声明):

         

    ID Token

    请注意,已提供列中没有always。我认为不同的API可能会有所不同。

  2. 同一文档的“ 获得用户个人资料信息”部分

    它说明了在何处获取/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端点发出请求。