我正在尝试在 SvelteKit 应用程序中实现 JWT 身份验证,但我在代码中的何处应该在站点重新加载时刷新我的访问令牌时遇到了问题。 根据我的发现,我应该将 JWT 存储在内存中,然后将刷新令牌存储为仅 HTTP cookie。当页面重新加载或在新选项卡中打开时,我需要调用后端来查看刷新令牌是否有效,如果有效,我将生成一个新的 JWT 并将其返回给客户端。
在哪里拨打此电话比较好?我认为
getSession
钩子会是一个好地方,但我无法从那里使用 fetch
。
仅限 HTTP 的 cookie 必须通过
Set-Cookie
标头设置。 SvelteKit 只有几个地方可以设置响应头:
handle()
挂钩。getSession()
可能不是一个好的选择。该钩子的主要目的是为浏览器创建服务器context
的清理版本(例如删除密码/API密钥等敏感信息。)它在handle()
钩子之后调用,因此设置为时已晚响应中的任何标头。
getContext()
可能是更好的选择,因为它是在 handle()
钩子之前调用的。因此,可以获取刷新令牌并将其存储在上下文中,直到 handle()
将其作为标头发送。上下文可以从 handle()
访问,如 request.context
虽然没有详细记录,但
fetch
可以从所有这些钩子中获得。只需将 node-fetch
添加为 package.json
中的依赖项(不是 devDependency!)。
我认为刷新钩子中的令牌的问题是每个请求都会发生刷新。这可能会给您的应用程序增加不必要的开销。
我认为最好的解决方案是将任何需要 JWT 令牌的 API 调用包装为 SvelteKit 端点。如果 API 调用由于令牌过时而失败,端点可以获取新令牌并通过响应标头中的
Set-Cookie
将其发送到浏览器。请注意,要使其正常工作,您必须确保端点由浏览器(而不是服务器)调用。SvelteKit 模板首先在服务器上执行,然后在浏览器中再次执行。如果从服务器调用端点,则不会设置浏览器 cookie。