我应该在哪里刷新 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。
我正在尝试在 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。