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/
中的验证
举个例子。
上一版本库生成的token:
eyJhbGciOiJSUzI1NiIsImtpZCI6Ijg2MTY0OWU0NTAzMTUzODNmNmI5ZDUxMGI3Y2Q0ZTkyMjZjM2NkODgiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJhY2NvdW50cy<...>1MWMifQ.OgOOhbTTbLYzcxNhNdvozf1<...>4bRLT3DILyWeO1FX64WaabGRjCR2amQ
新库生成的令牌:
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描述令牌。
我们正在将现有的 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/
中的验证举个例子。
上一版本库生成的token:
eyJhbGciOiJSUzI1NiIsImtpZCI6Ijg2MTY0OWU0NTAzMTUzODNmNmI5ZDUxMGI3Y2Q0ZTkyMjZjM2NkODgiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJhY2NvdW50cy<...>1MWMifQ.OgOOhbTTbLYzcxNhNdvozf1<...>4bRLT3DILyWeO1FX64WaabGRjCR2amQ
新库生成的令牌:
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描述令牌。