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

Proper way to do jwt refresh tokens with express

我正在考虑实现刷新令牌的正确模式,但在几个步骤中,我有一些问题。我在后端使用 nextjs with axios on the frontend and express with cookie-session。 以下是我正在考虑的步骤:

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

如果有更多的建议,那就太好了,谢谢。

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

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

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

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

获取它

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

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