我使用的是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}
我的工作流程如下:
-
我得到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, });
-
我将它们存储在我的数据库中。
-
我将誓言凭证设置为refresh_token
oauth2client。setCredentials({refresh_token:令牌)
refresh_token}); -
我从谷歌得到一个未过期的令牌:const accessToken = await oauth2client.getAccessToken();
-
我将oauth2client的凭据设置为新的未过期凭据。
oauth2client.setCredentials (accessToken);
-
我验证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);