【问题标题】:Where should I refresh my JWT in SvelteKit我应该在哪里刷新 SvelteKit 中的 JWT
【发布时间】:2021-07-19 04:36:05
【问题描述】:

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

在哪里打这个电话是个好主意?我在想getSession-hook 会是个好地方,但我不能从那里使用fetch

【问题讨论】:

    标签: jwt svelte sveltekit


    【解决方案1】:

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

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

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

    虽然没有很好的记录,fetch 可以从所有这些钩子中获得。只需在 package.json 中添加 node-fetch 作为依赖项(不是 devDependency!)。

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


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

    【讨论】:

      猜你喜欢
      • 2019-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-05
      • 2017-11-06
      • 1970-01-01
      • 2019-10-15
      • 2020-09-30
      相关资源
      最近更新 更多