仅 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。