我应该在哪里刷新我的SvelteKit JWT

我应该在哪里刷新我的SvelteKit JWT,jwt,svelte,sveltekit,Jwt,Svelte,Sveltekit,我正在尝试在一个SvelteKit应用程序中实现JWT身份验证,但我在代码中遇到了问题,我应该在站点重新加载时刷新accesstoken。 根据我的发现,我应该将JWT存储在内存中,然后将刷新令牌存储为仅HTTP的cookie。当页面在新选项卡中重新加载或打开时,我需要调用后端以查看刷新令牌是否有效,如果有效,我将生成一个新JWT并将其返回给客户端 打这个电话的好主意是什么?我认为getSession-钩子是个不错的地方,但是我不能从那里使用fetch。只能通过set Cookie头设置HTTP

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


打这个电话的好主意是什么?我认为
getSession
-钩子是个不错的地方,但是我不能从那里使用
fetch

只能通过
set Cookie
头设置HTTP Cookie。SvelteKit只有几个地方可以设置响应头:

  • 苗条的
  • 这个
getSession()
可能不是一个好的选择。此钩子的主要用途是为浏览器创建服务器
上下文的净化版本(如删除密码/API键等敏感信息)。它在
句柄()之后调用,因此在响应中设置任何头都为时已晚

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

尽管没有很好的文档记录,
fetch
可以从所有这些钩子中获得。只需在
package.json中添加
节点获取
作为依赖项(而不是依赖项!)

我认为在钩子中刷新令牌的问题是每次请求都会刷新。这可能会给你的应用程序增加不必要的开销


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