【问题标题】:SvelteKit: how can I add global error 401 handling?SvelteKit:如何添加全局错误 401 处理?
【发布时间】:2021-10-19 00:46:44
【问题描述】:

如何全局处理来自外部 API 的 401 错误?

首先,我的设置:

  1. 当用户登录时,我设置了一个jwt cookie,将一个jwt 属性写入session 存储区(来自$app/stores),然后重定向到网站的受保护部分。
  2. hooks.js 中,我有一个handle 函数,它基本上执行request.locals.jwt = cookies.jwt,然后是一个getSession 函数,它返回{ jwt: locals.jwt }
  3. 在我对受保护页面发出的每个 fetch 请求时,我都会访问并使用 session.jwt 将令牌发送到 API。

整个设置都有效。如果用户退出,我可以写一个空的 JWT cookie 并清除 $session.jwt 值,重定向回主页,完成。

但我没有办法添加全局 401 处理程序?我想要做的是清除 JWT cookie 并重定向到登录页面。在根 __error.svelte 中执行此操作似乎是显而易见的地方,但如果在 SSR 期间触发错误,那么显然我无法对 cookie 执行任何操作,并且 __error.svelte 不会在 browser 是 @ 的情况下第二次运行987654336@.

【问题讨论】:

  • 您找到解决方案了吗?我有一个类似的场景,我需要从外部 API 捕获 402 错误并显示错误页面,但我很难理解这是如何完成的。
  • 还没有,很遗憾。

标签: sveltekit


【解决方案1】:

或许你可以throw然后抓到window对象?

https://svelte.dev/repl/c6dddc73cbdd4f81883add43f5e3aa25?version=3.18.2

【讨论】:

  • 尝试了您的 REPL,但它不能正常工作(从 cmets 看起来就像您已经发现的那样)。我想知道为什么从处理程序更改 let var 没有效果。
【解决方案2】:

建议:为您的令牌使用仅限 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 响应。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多