使用 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 刷新令牌的正确方法的主要内容,如果未能解决你的问题,请参考以下文章