当前位置: 首页 > 知识库问答 >
问题:

NodeJs谷歌API oAuth2Clientrefresh_token使用太晚googleapi

淳于禄
2023-03-14

我正在使用npm包googleapis:^100.0.0,我得到了这个错误:

错误:令牌使用得太晚,1653569732.911

我的工作流程是这样的:

>

  • 我在第一个应用程序授权时从谷歌誓言获得access_token、refresh_token和id_token。

    const scopes =[" https://www . Google APIs . 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

    oauth 2 client . set credentials({ refresh _ token:tokens . refresh _ token });

    我从谷歌得到一个未过期的令牌:const access Token=waitoauth2client.getAccessToken();

    我将oauth 2客户机的凭证设置为新的未过期凭证。

    oauth2client.setCredentials(accessToken);

    我验证了标识令牌。

    const loginTicket = await oauth2client .verifyIdToken({ idToken: tokens.id_token, }) .catch((ex) =

    谷歌的文档说

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

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

    我是否在这里错过了一些可以让我在不将用户发送回google oauth屏幕的情况下重新验证用户的东西?

  • 共有1个答案

    支劲
    2023-03-14

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

    const accessToken = await oauth2client.getAccessToken();
    

    在Google的文档中,他们展示了如何使用这个令牌的例子:

    oauth2client.setCredentials(accessToken);
    

    问题是,这只有在用于获取未过期令牌的原始令牌没有过期的情况下才有效。一旦过期,getAccessToken()的返回值将完全改变形状。

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

     if (accessToken.res) {
          oauth2client.setCredentials(accessToken.res.data);
    
     类似资料:
    • 下面是https://github.com/google/google-api-nodejs-client的代码。 一般问题:刷新令牌实际上如何与访问令牌一起工作? 背景:根据我的解释,每个访问令牌都有一个有限的时间跨度(~1小时)。因此,当用户第一次连接到我的服务器(服务器为用户身份验证提供了机制)时,服务器将收到有限生命期访问令牌和一次性刷新令牌。1小时后,访问令牌过期。 谢了!

    • 我尝试过将deendpoint与云SQL和Hibernate集成。但是,每次都有错误。跟随我的测试: 1 -源文件夹中的persistence . XML:http://imgur.com/hKjf8Cs给我错误:http://imgur.com/QJe8rvq 2-资源文件夹中的persistence.xml给我错误: ServletInitializationParameters.java:5

    • 我需要从我的谷歌云存储从我的桶中下载NodeJS文件夹。我读了所有的留档,我只找到了下载文件而不是文件夹的方法。我需要获取/下载文件夹以提供用户的下载文件。 有人能帮我吗?

    • 我们需要为一个高流量的网站使用WordPress。我们预计每月的初始浏览量为50万次,并将增加到每月约800万次。主要在工作时间使用,一个月大约20天,每天8小时。 我们正在考虑将Google App Engine与Google Cloud SQL一起使用。我们想知道它对这种负载的扩展程度如何。理论上说Google App Engine应该自动扩展,但不确定Google Cloud SQL在扩展时

    • 我没有使用谷歌仪表板的经验,在过去的几天里,我一直在努力解决一个问题。我不确定这是否可能以及如何实现,但是阅读大量的留档让我模糊不清。 背景:我们使用谷歌标签管理器(GTM)在我们的网站上放置一个cookiebanner和cookies。此时,我们使用GTM加载“Google Analytics-Universal Analytics”。我们使用遗传算法收集模拟数据,分析数据显示在我们的遗传算法仪

    • 我想创建一个应用程序,在后端我想写代码node.js谷歌云平台支持node.js? 我可以看到只有Python,Java,PHP和GO支持。