Google OAuth v2.0 生成无效的 JWT

Google OAuth v2.0 generates invalid JWT

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

我们正在关注 this guide,我们的 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();

从我能够从 Google 检索令牌的意义上说,一切正常,只是新库生成的 JWT 令牌看起来无效。更准确地说,它不符合 JWT 令牌规范——令牌不由 3 部分组成 (header/payload/signature),而且它太短了(这意味着它可能没有携带它应该携带的所有数据)。它也没有通过 https://jwt.io/

中的验证

举个例子。

  1. 上一版本库生成的token:

    eyJhbGciOiJSUzI1NiIsImtpZCI6Ijg2MTY0OWU0NTAzMTUzODNmNmI5ZDUxMGI3Y2Q0ZTkyMjZjM2NkODgiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJhY2NvdW50cy<...>1MWMifQ.OgOOhbTTbLYzcxNhNdvozf1<...>4bRLT3DILyWeO1FX64WaabGRjCR2amQ

  2. 新库生成的令牌:

    ya29.A0ARrdaM_hHsX50Qim6c1NudaZvv6qMpMkbNxW-ltOh49s6U4JKZNvPJV3d0TAE_rqqvkvVG2983ryewiufhdsklKGiH-vEdIs7u2389iwek-dcgkY1SE-b21g0932oiweKT-ZKTJvmHAY

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

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

https://oauth2.googleapis.com/tokeninfo?id_token=ya29.A0ARrdaM_hHsX50Qim6c1NudaZvv....

注意:由于JWT承载了一些私有数据,所以我去掉了第一个token的base64编码部分(第一个点之后第二个点之前的部分),和第三部分(第二个点之后)一样。由于最后一个token看不懂,所以我也替换了里面的一些字符,不过应该不影响这个问题的演示。

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

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

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

curl -H 'Authorization: Bearer $ACCESS_TOKEN' https://www.googleapis.com/oauth2/v3/tokeninfo

根据用户身份创建的令牌的其他信息:

curl -H 'Authorization: Bearer $ACCESS_TOKEN' https://www.googleapis.com/oauth2/v3/userinfo

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

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