首页 > 解决方案 > 我应该在哪里刷新 SvelteKit 中的 JWT

问题描述

我正在尝试在 SvelteKit 应用程序中实现 JWT 身份验证,但在代码中的何处我应该在站点重新加载时刷新我的 accesstoken 时遇到问题。根据我的发现,我应该将 JWT 存储在内存中,然后将刷新令牌存储为仅限 HTTP 的 cookie。当页面重新加载或在新选项卡中打开时,我需要调用我的后端来查看刷新令牌是否有效,如果有效,我将生成一个新的 JWT 并将其返回给客户端。

在哪里打这个电话是个好主意?我在想getSession-hook 会是一个好地方,但我不能fetch从那里使用。

标签: jwtsveltesveltekit

解决方案


仅 HTTP cookie 必须通过Set-Cookie标头设置。SvelteKit 只有几个地方可以设置响应头:

getSession()可能不是一个好的选择。这个钩子的主要目的是context为浏览器创建一个经过清理的服务器版本(比如删除密码/API 密钥等敏感信息。)它在handle()钩子之后调用,因此在响应中设置任何标题都为时已晚。

getContext()可能是更好的选择,因为它是在handle()钩子之前调用的。因此,可以获取刷新令牌并将其存储在上下文中,直到handle()将其作为标头发送。上下文可以从handle()asrequest.context

虽然没有很好的文档记录,但fetch可以从所有这些钩子中获得。只需添加node-fetch作为依赖项package.json(不是 devDependency!)。

我认为刷新钩子中的令牌的问题是刷新会在每个请求上发生。这可能会给您的应用增加不必要的开销。


我认为最好的解决方案是将任何需要 JWT 令牌的 API 调用包装为 SvelteKit 端点。如果 API 调用由于过期令牌而失败,端点可以获取新令牌并通过Set-Cookie响应标头中的方式将其发送到浏览器。请注意,要使其正常工作,您必须确保端点正在由浏览器(而不是服务器)调用。SvelteKit 模板首先在服务器上执行,然后再次在浏览器中执行。如果从服务器调用端点,则不会设置浏览器 cookie。


推荐阅读