sveltekit - SvelteKit:如何添加全局错误 401 处理?
问题描述
如何全局处理来自外部API 的 401 错误?
首先,我的设置:
- 当用户登录时,我设置了一个
jwt
cookie,将一个jwt
属性写入session
存储(从$app/stores
),然后重定向到网站的受保护部分。 - 在
hooks.js
我有一个handle
基本上可以做的函数request.locals.jwt = cookies.jwt
,然后是一个getSession
返回的函数{ jwt: locals.jwt }
- 在我在受保护页面上发出的每个
fetch
请求中,我都会访问并使用session.jwt
将令牌发送到 API。
整个设置有效。如果用户注销,我可以写一个空的 JWT cookie 并清除$session.jwt
值,重定向回主页,完成。
但是我看不到添加全局 401 处理程序的方法吗?我想要做的是清除 JWT cookie 并重定向到登录页面。在根目录中执行此__error.svelte
操作似乎是显而易见的地方,但如果在 SSR 期间触发错误,那么显然我无法对 cookie 执行任何操作,并且__error.svelte
不会再次运行 where browser
is true
。
解决方案
建议:为您的令牌使用仅 HTTP cookie(可选,但可能更好)
中__layout.svelte
,我们有
<script lang="ts" context="module">
import { isPublic, isAuthenticated } from '$lib/auth/auth0_front';
import type { Load } from '@sveltejs/kit';
export const load: Load = async ({ page, session }) => {
if (!isPublic(page.path) && !isAuthenticated(session)) {
console.log('Unauthorized access to private page');
return { redirect: '/', status: 302 };
} else {
console.log('Auth OK');
}
return {};
};
</script>
在前端,我们使用原生 fetch 的小包装器,通过将页面重定向到主页或登录页面来处理 401 响应。
推荐阅读
- amazon-web-services - cloudformation 从 LoadBalancerArn 获取 DNSName
- angular - 管道成功排序和记录数据,但未在 html 中显示
- git - 防止在本地处理 dev 分支
- mysql - MySQL,获取一周中所有日子的平均值
- javascript - 在没有更改属性的情况下如何添加 CSS 过渡?
- sql-server - 按季度分组(日期部分)返回具有相同季度的多行
- python - 如何在 Django 模型中与父表共享子外部表
- jquery - 条件 jQuery 字符串
- sql - 如何根据多个条件删除记录i sql
- c# - 无论选择什么索引,对象列表视图始终设置第一项