Google OAuth v2.0 生成无效的 JWT

van*_*art 1 oauth-2.0 jwt google-oauth google-cloud-platform

我们正在将现有的 Javascript Google 登录迁移到新的 Google OAuth 库,如此处弃用通知中所述 - https://developers.googleblog.com/2021/08/gsi-jsweb-deprecation.html

我们遵循本指南,我们的 javascript 代码如下所示:

const client = google.accounts.oauth2.initTokenClient({
    client_id: <our-client-id>,
    scope: 'https://www.googleapis.com/auth/userinfo.email \
            https://www.googleapis.com/auth/userinfo.profile',
    callback: (tokenResponse: any) => {
        if (tokenResponse && tokenResponse.access_token) {
            if (google.accounts.oauth2.hasGrantedAllScopes(tokenResponse,
                'https://www.googleapis.com/auth/userinfo.email',
                'https://www.googleapis.com/auth/userinfo.profile')) {
                
                console.log(tokenResponse.access_token );

                .. further auth logic
                 
            }
        }
    }
});
client.requestAccessToken();
Run Code Online (Sandbox Code Playgroud)

从某种意义上说,一切工作正常,我能够从 Google 检索令牌,只是看起来新库生成的 JWT 令牌无效。更准确地说,它与 JWT 令牌规范不匹配 - 令牌不由 3 部分组成(标头/有效负载/签名)并且太短(意味着它可能不携带应携带的所有数据)。它也没有通过 https://jwt.io/中的验证

让我给你举个例子。

  1. 以前版本的库生成的令牌:

    eyJhbGciOiJSUzI1NiIsImtpZCI6Ijg2MTY0OWU0NTAzMTUzODNmNmI5ZDUxMGI3Y2Q0ZTkyMjZjM2NkODgiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJhY2NvdW50cy<...>1MWMifQ.OgOOhbTTbLYzcx NhNdvozf1<...>4bRLT3DILyWeO1FX64WaabGRjCR2amQ

  2. 新库生成的令牌:

    ya29.A0ARrdaM_hHsX50Qim6c1NudaZvv6qMpMkbNxW-ltOh49s6U4JKZNvPJV3d0TAE_rqqvkvVG2983ryewiufhdsklKGiH-vEdIs7u2389iwek-dcgkY1SE-b21g0932oiweKT-ZKTJvmHA是

因此,问题是新版本的库不会返回正确的 JWT 令牌(如上所述)。我们不能将这个新令牌用于任何用途,因为我们无法验证它的完整性(谁颁发的、令牌秘密是否与我们的应用程序 ID 匹配、令牌何时过期等)。

我还尝试使用 Google 自己的 OAuth 调试端点对此进行测试,但它也抱怨第二个令牌无效:

https://oauth2.googleapis.com/tokeninfo?id_token=ya29.A0ARrdaM_hHsX50Qim6c1NudaZvv....
Run Code Online (Sandbox Code Playgroud)

注意:由于 JWT 包含一些私有数据,因此我剥离了第一个令牌的 base64 编码部分(第一个点之后和第二个点之前的部分),与第三部分(第二个点之后)相同。由于我无法理解最后一个标记,我也替换了其中的一些字符,但这应该不影响这个问题的演示。

有人遇到过这样的事情吗?我们有一组现有项目需要迁移到新的 JS 库,但看起来它根本不起作用。我尝试从头开始创建一个新项目,只是为了看看问题是否仅影响旧项目,但没有成功 - 使用新方法时,Google OAuth 返回相同的损坏令牌。

Joh*_*ley 5

Google OAuth 访问令牌不是JWT。它们是不透明的二进制值,这意味着您无法直接从令牌中提取信息。然而,谷歌可以在其系统中查找该令牌。

您可以通过调用此端点来验证 Google OAuth 访问令牌:

curl -H 'Authorization: Bearer $ACCESS_TOKEN' https://www.googleapis.com/oauth2/v3/tokeninfo
Run Code Online (Sandbox Code Playgroud)

根据用户身份创建的令牌的附加信息:

curl -H 'Authorization: Bearer $ACCESS_TOKEN' https://www.googleapis.com/oauth2/v3/userinfo
Run Code Online (Sandbox Code Playgroud)

如果令牌无效,则请求将失败。

返回的信息将是描述令牌的 JSON。