【问题标题】:JWT signed token expiresIn not changing in browser application even after changed in the codeJWT 签名令牌过期即使在代码中更改后浏览器应用程序中也不会更改
【发布时间】:2020-11-14 14:30:58
【问题描述】:

原码:

const token = jwt.sign({ _id: user._id }, process.env.JWT_SECRET, { expiresIn: '1d' });
        
res.cookie('token', token, { expiresIn: '1d' });

这行得通。令牌在创建后正好一天就过期了。

变化:

const token = jwt.sign({ _id: user._id }, process.env.JWT_SECRET, { expiresIn: '1m' });
        
res.cookie('token', token, { expiresIn: '1m' });

我退出,重新启动服务器,但仍然没有任何变化!令牌仍然设置为在一天后过期。我正在学习一门课程,当课程讲师在他的代码中进行此更改时,它按预期工作。令牌在一分钟后过期。

我什至尝试过:

const token = jwt.sign({ _id: user._id }, process.env.JWT_SECRET, { expiresIn: '10' });
        
res.cookie('token', token, { expiresIn: '10' });

预计令牌将在十秒或十毫秒内到期(我不确定默认单位是什么),但结果仍然相同。令牌仍设置为在一天后过期。

这是缓存吗?我对缓存、它是什么以及它是如何工作的知识几乎为零,但我很难想象对此的解释是在 NodeJS 编码本身的常规范围内。如果是这样,那将非常简单。 jwt 模块或我的应用程序如何处理整个应用程序中的 cookie 或令牌没有其他“配置”。

我包含 next.js 标记是因为我在 next.js 应用程序中使用它(虽然我怀疑这是否相关,但我当然可能是错的)。

【问题讨论】:

  • 我在这段代码中找不到任何错误,你可以用你的方法编辑它
  • 您是否尝试过检查应用程序中的 cookie?有单个 cookie 还是多个 cookie? cookie 中的令牌是什么?令牌看起来如何?当您在 jwt.io 上手动解包时,它显示的到期日期是什么?
  • @BINFASK 代码中没有任何错误。这就是为什么我很困惑。我把token的过期时间改成一分钟还是10分钟,怎么还有一天?
  • @WiktorZychla 我查看了 cookie,有一个名为 token 的 cookie(正如预期的那样),这个令牌的到期日期正好是我登录后的一天。这是意料之中的使用expiresIn: '1d' 代码,但即使我将其更改为'1m''10',它仍会保留一天。我没有使用 jwt.io“手动解包”。我以前从来没有这样做过。令牌只是一串很长的数字和字符。
  • 你能把cookie部分的expiresIn属性改成maxAge吗

标签: node.js jwt next.js express-jwt


【解决方案1】:

我想通了。不要因为缺少我没有意识到的信息而对任何评论潜在解决方案的人感到不满。

这是一个 NextJS 应用程序,前端有单独的逻辑来设置这个 cookie 的到期日期。此到期日期设置为一天,我没有更改它(我忘记它存在)。一旦我更改它,更改就会反映在浏览器中。

我猜你可以为签名的 jwt 设置一个与前端的 cookie 过期日期不同的过期日期。这是多余的,不可取的。我将不得不寻找一个不同的长期解决方案。我不认为这对现实世界的应用程序有好处,因为它很难理解正在发生的事情。

今天早上早些时候,在我弄清楚这一点之前,10 毫秒的 jwt 到期终于开始工作了,但只是在后端。我收到一个后端错误,说我的 jwt 会话已过期,这是意料之中的。在我的前端页面上向后端发出的请求失败,因为它没有经过身份验证,所以我得到了预期的行为,但不是我预期的方式。

编辑:我相信我找到了困惑的症结所在。下面的代码是用于在响应中设置 cookie 的后端代码,但是因为我们使用单独的逻辑在前端设置 cookie,我相信这段代码实际上并没有做任何事情。我查看了接收签名 jwt 令牌的前端代码,并且没有任何地方引用 res.cookie。我相信这一定是教师认为必要的额外代码行。我今天没时间了,但我会尝试在没有这行代码的情况下运行应用程序,看看是否能获得相同的功能。

res.cookie('token', token, { expiresIn: '1d' });

关于这个:

我猜你可以为签名的 jwt 设置一个过期日期,即 与前端的 cookie 到期日期分开。它是 多余且不可取。我将不得不寻找不同的 长期解决方案。我不觉得这对现实世界有好处 应用程序,因为它很难理解正在发生的事情。

我开始明白,这是一个额外的安全层,很有价值。问题不在于后端的 jwt 逻辑。这里的问题只是我在浏览器中的两个不同位置设置了额外的逻辑,并调整了应用程序和浏览器未使用的逻辑。

【讨论】:

    猜你喜欢
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 2020-02-17
    • 2020-11-18
    • 1970-01-01
    • 1970-01-01
    • 2019-04-18
    • 2018-09-10
    相关资源
    最近更新 更多