NodeJs Google API oauth2client refresh_token使用太晚 &g



我使用的是npm包googleapi:^100.0.0我得到这个错误:

错误:令牌使用太晚,1653569732.911>1653511671:{"iss"https://accounts.google.com"azp":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com","aud":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com","sub":"113117610373384376838","email":"XXXXXXXXXX@gmail.com","email_verified":真的,"at_hash":"xxxxxxxxxxxxxxxxxxxxxxxx","iat": 1653507771,"exp": 1653511371}

我的工作流程如下:

  1. 我得到access_token, refresh_token,和id_token从谷歌誓言在第一个应用程序授权。

    const scope = ["https://www.googleapis.com/auth/userinfo.email" "openid"];

    oauth2client.setCredentials({ refresh_token: tokens.refresh_token }); 
    const url = oauth2client.generateAuthUrl({
    // 'online' (default) or 'offline' (gets refresh_token)
    access_type: "offline",
    // If you only need one scope you can pass it as a string
    scope: scopes,
    });
    
  2. 我将它们存储在我的数据库中。

  3. 我将誓言凭证设置为refresh_token

    oauth2client。setCredentials({refresh_token:令牌)

    refresh_token});
  4. 我从谷歌得到一个未过期的令牌:const accessToken = await oauth2client.getAccessToken();

  5. 我将oauth2client的凭据设置为新的未过期凭据。

    oauth2client.setCredentials (accessToken);

  6. 我验证IdToken。

    const loginTicket = await oauth2client.verifyIdToken ({idToken: tokens.id_token,}(.catch ((ex) =比;{包厢(ex);结果。error = "Token可能使用得太晚了。";});

Google的文档说

在用户授予对所请求范围的脱机访问之后,当用户脱机时,您可以继续使用API客户端代表用户访问Google API。客户端对象将根据需要刷新访问令牌。

我可以登录谷歌并验证id_token几个小时。然而,几个小时后,我得到一个令牌使用太晚的错误。

我在这里错过了一些东西,将允许我重新验证用户而不发送用户回谷歌验证屏幕?

这比它应该花的时间长,但我发现了问题所在。我把它贴在这里,希望如果有人发现同样的问题,我可以节省他们追踪它的麻烦。我的问题是

的返回值
const accessToken = await oauth2client.getAccessToken();

在Google的文档中,他们将此作为如何使用此令牌的示例:

oauth2client.setCredentials(accessToken);
问题是,只有当用于获取未过期令牌的原始令牌未过期时,这才有效。一旦过期,getAccessToken()的返回值将完全改变形状。

修复相当容易。您首先必须检查accessToken是否有一个名为res的成员。如果有,那么您将oauth2client的凭据设置为accessToken.res.data,而不是使用accessToken本身。

if (accessToken.res) {
oauth2client.setCredentials(accessToken.res.data);

最新更新