javascript - 无法在服务器端注销用户(Next.js 和 Supabase)

标签 javascript typescript next.js server-side-rendering supabase

使用 Supabase 作为身份验证提供程序时,如何在服务器端注销用户?

我认为最简单、最明显的解决方案就是这样做:

export const getServerSideProps: GetServerSideProps = withPageAuth({
    redirectTo: '/auth/sign-in',
    authRequired: true,
    async getServerSideProps(ctx) {
        const session = await supabaseServerClient(ctx).auth.session();
        await supabaseServerClient(ctx).auth.api.signOut(session!.access_token); // There is a valid access token

        return {
            redirect: {
                permanent: false,
                destination: '/auth/sign-in',
            }
        }
    }
});

我相信这也是文档所说的,但是当我这样做时,signOut 的响应是:

{ error: null }

但它没有做任何事情。重定向发生后,客户端上的 onAuthStateChange 会通过 TOKEN_REFRESH 触发。

肯定有什么地方我不明白,但我不知道那是什么。

最佳答案

这将不起作用,因为您使用的 Supabase Auth Helpers 会将 token 存储在该域的 cookie 中。您还需要删除 cookie 才能使其正常工作。或者,您应该使用注销端点,它会为您处理所有这些事情。

import { supabaseClient, withPageAuth } from "@supabase/auth-helpers-nextjs";
import {
  setCookies,
  NextRequestAdapter,
  NextResponseAdapter,
} from "@supabase/auth-helpers-shared";

export const getServerSideProps = withPageAuth({
  redirectTo: "/",
  async getServerSideProps(ctx) {
    const session = supabaseClient.auth.session();
    await supabaseClient.auth.api.signOut(session.access_token);

    setCookies(
      new NextRequestAdapter(ctx.req),
      new NextResponseAdapter(ctx.res),
      ["access-token", "refresh-token", "provider-token"].map((key) => ({
        name: `sb-${key}`,
        value: "",
        maxAge: -1,
      }))
    );

    return {
      redirect: {
        destination: "/",
        permanent: false,
      },
    };
  },
});

关于javascript - 无法在服务器端注销用户(Next.js 和 Supabase),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72972086/

相关文章:

javascript - 部署到 Heroku 时异步功能不起作用

javascript - 更改 CKEditor 实例的配置选项

javascript - Chrome 中的 onclick

typescript - 如何在 typescript 中使用枚举作为索引键类型?

reactjs - Next.js:在 getStaticProps 中使用 "revalidate"选项和使用 SWR 包有什么区别?

css - 特定断点处元素的边距在 Tailwind 中不起作用

reactjs - React Typescript Hook 错误 - 该表达式不可调用

javascript - 将额外未使用的日期字段添加到自定义类型时,测试会引发错误 TS2322 和 TS2769

javascript - 在 Typescript 中,如何在存储然后从数组访问所述对象时维护对象类型?

javascript - d3 : tooltips on multi series line chart at each line when mouse hover event