使用 express 执行 jwt 刷新令牌的正确方法

Posted

技术标签:

【中文标题】使用 express 执行 jwt 刷新令牌的正确方法【英文标题】:Proper way to do jwt refresh tokens with express 【发布时间】:2021-10-02 03:50:36 【问题描述】:

我正在考虑实施刷新令牌的适当模式,但在几个步骤中,我有一些问题。我在前端使用nextjs 和axios,在后端使用cookie-session 表达。 以下是我正在考虑的步骤:

    客户端发送登录请求。登录后,我将访问令牌放入会话对象中,并将刷新令牌放入 res.cookie,既安全又 httpOnly。
  // for simplicity options are left out
  req.session =  accessToken ;
  res.cookie("refreshToken", refreshToken)
    在每次使用 axios 的请求时,我只提供访问令牌。这是第一个问题出现的地方。如果两者都是 httpOnly,我将如何只提供访问令牌而不发送刷新令牌? 如果访问令牌有效,请执行所需的任何操作。如果没有,则需要获取刷新令牌并将其与存储的令牌进行比较,依此类推。这是第二个问题。虽然我知道我需要在此步骤中检索刷新令牌,但我该如何正确执行?

如果有更多建议会很好,谢谢。

[编辑] 经过一番思考,我意识到使访问令牌不是 httpOnly 将允许我仅发送访问令牌,这将解决我的问题。但如果这不正确,请告诉我。

【问题讨论】:

【参考方案1】:

这是标准模式 - 如this code of mine:

客户端发送访问令牌(可能在 HTTP Only cookie 中) 当它过期时,他们会尝试通过调用 /refresh 端点来刷新访问令牌 如果刷新成功,他们将使用新的访问令牌重试 API 请求 否则客户端会重定向用户重新登录

不要将访问令牌设为非 HTTP Only,因为任何恶意代码都可以从 document.cookie 中获取它。

这也允许您为 RT cookie 设置 /refresh 的路径,以便它仅在刷新请求时发送。

还要确保包含令牌的 cookie 使用仅服务器端已知的对称密钥进行强加密 (AES256)。 This Express library 将为您完成工作。

【讨论】:

谢谢,这太棒了,几乎就是我要做的。我最近了解了 cookie 上的路径,这是我需要的,而不是非 HTTP Only。 太棒了 - 也看到我刚刚添加的加密点

以上是关于使用 express 执行 jwt 刷新令牌的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

在 Express.js 中刷新 JWT

如何从标头中正确获取 jwt 令牌并将其与 express 一起使用

JWT身份验证中刷新令牌的正确实现是啥

如何使用 JWT 刷新令牌生成新的访问令牌

在 Passportjs 中刷新 JWT 令牌

使用刷新令牌对 JWT 的端点 /logout 执行的操作