我要为几个独立的服务实现JWT认证。 会有auth.example.com和service1.example.com,service2.example.com等
我的假设:
接下来,如果我有一个服务——多页面应用程序(即不是 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 通常不应该(不能)用于多页(传统)应用程序,这是真的吗?或者有解决这个问题的好方法?或者这根本不是问题(用户不会经常关闭选项卡,或者他们希望网站将他们注销或重定向等)?
我使用 ServiceWorkers 在多页面项目中实现了基于令牌的身份验证。
使用 ServiceWorker,您将能够创建一个获取事件处理程序,该处理程序将为您的前端发送的每个请求调用。在此处理程序中,您可以重定向、发送请求、添加身份验证标头和存储令牌。 在注册 ServiceWorker 之后,这个获取处理程序将在每次请求时执行。即使在页面加载时。
我是这样配置的
处理程序将在每次请求时:
/auth/refresh
.我也有一些额外的检查,当我必须登录和注销时。
在登录请求时,处理程序将:
在注销请求时,处理程序将: