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

Where should I refresh my JWT in SvelteKit

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

在哪里打这个电话比较好?我在想 getSession-hook 会是个好地方,但我无法从那里使用 fetch

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

getSession() 可能不是一个好的选择。这个钩子的主要目的是为浏览器创建一个服务器 context 的净化版本(比如删除像 passwords/API 键这样的敏感信息。)它在 handle() 钩子之后被调用,所以它在响应中设置任何 header 都为时已晚。

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

访问上下文

虽然不是 well-documented,但所有这些挂钩都可以使用 fetch。只需将 node-fetch 添加为 package.json 中的依赖项(不是 devDependency!)。

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


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