JWT 刷新令牌和多页应用程序

问题描述 投票:0回答:1

我要为几个独立的服务实现JWT认证。 会有auth.example.com和service1.example.com,service2.example.com等

我的假设

  • JWT 可以保存在“.example.com”的 cookie 中
  • JWT 到期时间应该很小(例如 15 分钟),因为没有可靠的方法可以使用 JWT 令牌(撤销令牌)注销用户。
  • 刷新令牌应该用于补发 JWT 令牌
  • 出于安全原因,刷新令牌 cookie 只能由 auth.example.com 访问,因为 https://www.rfc-editor.org/rfc/rfc6749#section-1.5“与访问令牌不同,刷新令牌仅用于授权服务器,永远不会发送到资源服务器。”

接下来,如果我有一个服务——多页面应用程序(即不是 SPA),其中一些 URL 被称为“传统”方式,而不是通过 Ajax 和呈现 HTML 基于一些服务器端逻辑,当然包括检查用户授权。

然后,比如说,会有一个动作service1.example.com/user/showpage

if (user.logged_in) {
  render_some_html(get_some_data(user.login))
}
else {
  render_anonimous_uses_page()
}

问题是

如果站点用户关闭所有站点选项卡,然后大约一个小时后,直接转到页面 /user/showpage(或者他可能 暂停笔记本电脑并在一个小时内将其唤醒并转到该页面)。

如果到那时 JWT 令牌将过期怎么办。然后通过 Refresh 令牌刷新它,我们需要对 auth.example.com 进行 Ajax 调用(因为 Refresh 令牌仅存储在 auth.example.com cookie 中)并且这在服务器端渲染中是不可访问的(我在上面发布的伪代码,它是服务器端,并且不可能在服务器代码执行过程中进行客户端 ajax 调用.它在这里不适用)。这样用户将被视为已注销 在这个舞台上。

重定向可能是一种解决方案..但是如果网站也应该为匿名用户工作,并且无论如何都在寻找更好的东西怎么办。

SPA 应用不存在这个问题,因为每次 Ajax 调用内部 API 之前,它可以检查 JWT 并调用刷新 JWT 令牌。

问题是:由于这个问题,JWT 通常不应该(不能)用于多页(传统)应用程序,这是真的吗?或者有解决这个问题的好方法?或者这根本不是问题(用户不会经常关闭选项卡,或者他们希望网站将他们注销或重定向等)?

authentication jwt single-page-application refresh-token
1个回答
0
投票

我使用 ServiceWorkers 在多页面项目中实现了基于令牌的身份验证。

使用 ServiceWorker,您将能够创建一个获取事件处理程序,该处理程序将为您的前端发送的每个请求调用。在此处理程序中,您可以重定向、发送请求、添加身份验证标头和存储令牌。 在注册 ServiceWorker 之后,这个获取处理程序将在每次请求时执行。即使在页面加载时。

我是这样配置的
处理程序将在每次请求时:

  • 检查访问令牌是否有效(检查过期)。
  • 如果令牌无效:调用
    /auth/refresh
    .
  • 将访问令牌添加到身份验证标头。
  • 将更新后的请求发送到后端。

我也有一些额外的检查,当我必须登录和注销时。
在登录请求时,处理程序将:

  • 从 ServiceWorker 调用登录 URL。
  • 从登录响应中获取访问令牌。
  • 将登录响应返回给前端。

在注销请求时,处理程序将:

  • 从浏览器存储中删除访问令牌。
  • 将更新后的请求发送到后端。

这是我的 Astro 项目的 ServiceWorker。

© www.soinside.com 2019 - 2024. All rights reserved.