jwt - 我应该在哪里刷新 SvelteKit 中的 JWT
问题描述
我正在尝试在 SvelteKit 应用程序中实现 JWT 身份验证,但在代码中的何处我应该在站点重新加载时刷新我的 accesstoken 时遇到问题。根据我的发现,我应该将 JWT 存储在内存中,然后将刷新令牌存储为仅限 HTTP 的 cookie。当页面重新加载或在新选项卡中打开时,我需要调用我的后端来查看刷新令牌是否有效,如果有效,我将生成一个新的 JWT 并将其返回给客户端。
在哪里打这个电话是个好主意?我在想getSession
-hook 会是一个好地方,但我不能fetch
从那里使用。
解决方案
仅 HTTP cookie 必须通过Set-Cookie
标头设置。SvelteKit 只有几个地方可以设置响应头:
- 苗条的端点
handle()
钩子。_
getSession()
可能不是一个好的选择。这个钩子的主要目的是context
为浏览器创建一个经过清理的服务器版本(比如删除密码/API 密钥等敏感信息。)它在handle()
钩子之后调用,因此在响应中设置任何标题都为时已晚。
getContext()
可能是更好的选择,因为它是在handle()
钩子之前调用的。因此,可以获取刷新令牌并将其存储在上下文中,直到handle()
将其作为标头发送。上下文可以从handle()
asrequest.context
虽然没有很好的文档记录,但fetch
可以从所有这些钩子中获得。只需添加node-fetch
作为依赖项package.json
(不是 devDependency!)。
我认为刷新钩子中的令牌的问题是刷新会在每个请求上发生。这可能会给您的应用增加不必要的开销。
我认为最好的解决方案是将任何需要 JWT 令牌的 API 调用包装为 SvelteKit 端点。如果 API 调用由于过期令牌而失败,端点可以获取新令牌并通过Set-Cookie
响应标头中的方式将其发送到浏览器。请注意,要使其正常工作,您必须确保端点正在由浏览器(而不是服务器)调用。SvelteKit 模板首先在服务器上执行,然后再次在浏览器中执行。如果从服务器调用端点,则不会设置浏览器 cookie。
推荐阅读
- node.js - 玉中if else的使用
- python - 如何创建与其他数组具有相同列数但行数为零的新ndarray
- angular - Toastr 中缺少 ToastData
- javascript - 在指针输入事件上更改标记图像
- javascript - 在 PHP 中访问 javascript 函数以获取 shell 命令
- excel - Excel VBA:用作电子邮件地址时缺少前导零
- apache - 当将路径作为流文件属性传递时,XMLValidator 不起作用,但是当直接在模式中传递完全相同的路径时,它会起作用
- ios - 未定义符号 _UnitySendMessage
- r - 新数据上的随机森林模型预测误差
- r - 为同一图中的每一行绘制 ecdf