【问题标题】:Cloud Function - Checking if a token has expired检查令牌是否已过期
【发布时间】:2021-12-21 13:18:59
【问题描述】:

如何检查 Google Api 访问令牌是否已过期?

使用Nodejs Google Api Client 并在登录时成功获取刷新和访问令牌。但是,当访问令牌在 1 小时后过期时,我遇到了问题。

我创建了一个函数,用于检查令牌是否在每次 api 调用时过期。这一直有效,直到令牌过期,在这种情况下它会引发错误:

const tokenInfo = await oauth2Client.getTokenInfo(req.params.accessToken);

该库有一个应该自动刷新令牌的功能。但是,它不适用于我的实现。

本质上,我只是在寻找一个在令牌过期时返回布尔值 true/false 的函数,然后我可以从那里处理所有事情。有什么办法可以设置吗?感谢您的帮助!

router.get("/api/tokenrefresh/:userId/:accessToken", async function (req, res) {

    //Library auto-refresh function. Nothing ever console logs. 
    oauth2Client.on("tokens", (tokens) => {
      if (tokens.refresh_token) {
        console.log(tokens.refresh_token);
      }
      console.log(tokens.access_token);
      req.params.accessToken = tokens.access_token
      res.json({
        refreshNeeded: true,
        token: tokens.access_token,
      });
    });

    //my logic to check status of token. Works until token expires then throws error
    const tokenInfo = await oauth2Client.getTokenInfo(req.params.accessToken);

    console.log(tokenInfo.expiry_date);
    console.log(Date.now());

    console.log('DIFFERENT IN TIMES', tokenInfo.expiry_date - Date.now());

    res.json({
      refreshNeeded: false,
    });

【问题讨论】:

  • Google Api 访问令牌
  • 我想到了这一点,但担心是否由于令牌过期以外的原因引发错误。除非(现在我正在大声思考),将这个函数包装在一个 try catch 中,例如:try { const tokenInfo = await oauth2Client.getTokenInfo(req.params.accessToken); } catch(error) {//refresh the token} 编辑:我将对其进行测试。我认为这可能会做到。

标签: javascript node.js reactjs google-cloud-platform google-api


【解决方案1】:

虽然令牌中的到期时间大部分是准确的,但您不能依赖它,因为令牌可能会提前到期。在每个请求之前调用令牌信息端点通常也不是一个好主意,因为它可能会导致不必要的额外延迟并可能对高频 API(例如 Bigtable)的端点造成冲击

最佳实践是实际尝试您想要执行的请求 - 并在错误处理程序中尝试刷新相应的错误代码。确保您对重试有限制,以避免在您不断遇到错误的情况下冒死循环的风险。

另外,虽然我不能 100% 确定您使用的是哪种框架,但您发布的代码对我来说看起来很危险:您的 API/网站中不应该有一个端点可以检索任何用户的访问令牌ID。这等于帐户泄露。如果遭到破坏/泄露,刷新和访问令牌会授予访问权限,因此必须小心处理。

【讨论】:

  • 关于代码安全的第三点,我如何将更新的令牌从后端传递到当前用户的前端?我遇到的最大问题是拥有当前用户 ID,因此我可以更新 Postgres 中的正确行。像这样的静态路由:/api/token,然后将所需的用户 ID 作为正文信息传递仍然会带来安全风险吗?我的另一个想法是在单独的路由中传递 id,然后将其作为变量存储在 Node.js 中。从那里只需使用该变量而不是将userId 作为参数或正文元素传递。关于如何最好地解决这个问题的想法?
  • 如果您从 Web 应用程序调用 API,请查看:developers.google.com/identity/protocols/oauth2/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-12
  • 2019-03-27
  • 2023-03-27
  • 2016-01-03
  • 2016-08-16
  • 2015-06-18
相关资源
最近更新 更多