middleware - 使用 Next.js13 和 Next/Supabase 身份验证时出错

标签 middleware supabase next.js13

登录后出现此问题: 无法解析 cookie 字符串:[错误:边缘运行时不支持 Node.js 'buffer' 模块。 了解更多信息:https://nextjs.org/docs/messages/node-module-in-edge-runtime]。

中间件.ts:

import { createMiddlewareSupabaseClient } from "@supabase/auth-helpers-nextjs";
import { NextResponse } from "next/server";

import { Database } from "./types/supabase";
import type { NextRequest } from "next/server";

export async function middleware(req: NextRequest) {
  const res = NextResponse.next();
  const pathname = req.nextUrl.pathname;

  const supabase = createMiddlewareSupabaseClient<Database>({ req, res });

  const {
    data: { session },
  } = await supabase.auth.getSession();

  if (!session && pathname === "/") {
    const url = new URL(req.url);
    url.pathname = "/login";
    return NextResponse.redirect(url);
  }

  return res;
}

supabase-auth-provider:

"use client";

import { Profile } from "../../types/collections";
import { Session } from "@supabase/supabase-js";
import { useRouter } from "next/navigation";
import { createContext, useContext, useEffect } from "react";
import useSWR from "swr";
import { useSupabase } from "./supabase-provider";
interface ContextI {
  user: Profile | null | undefined;
  error: any;
  isLoading: boolean;
  mutate: any;
  signOut: () => Promise<void>;
  signInWithGithub: () => Promise<void>;
  signInWithEmail: (email: string, password: string) => Promise<string | null>;
}
const Context = createContext<ContextI>({
  user: null,
  error: null,
  isLoading: true,
  mutate: null,
  signOut: async () => {},
  signInWithGithub: async () => {},
  signInWithEmail: async (email: string, password: string) => null,
});

export default function SupabaseAuthProvider({
  serverSession,
  children,
}: {
  serverSession?: Session | null;
  children: React.ReactNode;
}) {
  const { supabase } = useSupabase();
  const router = useRouter();

  // Get USER
  const getUser = async () => {
    const { data: user, error } = await supabase
      .from("profiles")
      .select("*")
      .eq("id", serverSession?.user?.id)
      .single();
    if (error) {
      console.log(error);
      return null;
    } else {
      return user;
    }
  };

  const {
    data: user,
    error,
    isLoading,
    mutate,
  } = useSWR(serverSession ? "profile-context" : null, getUser);

  // Sign Out
  const signOut = async () => {
    await supabase.auth.signOut();
    router.push("/login");
  };

  // Sign-In with Github
  const signInWithGithub = async () => {
    await supabase.auth.signInWithOAuth({ provider: "github" });
  };

  // Sign-In with Email
  const signInWithEmail = async (email: string, password: string) => {
    const { error } = await supabase.auth.signInWithPassword({
      email,
      password,
    });

    if (error) {
      return error.message;
    }

    return null;
  };

  // Refresh the Page to Sync Server and Client
  useEffect(() => {
    const {
      data: { subscription },
    } = supabase.auth.onAuthStateChange((event, session) => {
      if (session?.access_token !== serverSession?.access_token) {
        router.refresh();
      }
    });

    return () => {
      subscription.unsubscribe();
    };
  }, [router, supabase, serverSession?.access_token]);

  const exposed: ContextI = {
    user,
    error,
    isLoading,
    mutate,
    signOut,
    signInWithGithub,
    signInWithEmail,
  };

  return <Context.Provider value={exposed}>{children}</Context.Provider>;
}

export const useAuth = () => {
  let context = useContext(Context);
  if (context === undefined) {
    throw new Error("useAuth must be used inside SupabaseAuthProvider");
  } else {
    return context;
  }
};

我尝试检查问题所在,但没有任何相关信息。

最佳答案

当我将 middleware.js 文件放在 app 目录之外时,我遇到了这个问题,也许这就是您遇到的问题。

关于middleware - 使用 Next.js13 和 Next/Supabase 身份验证时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76029908/

相关文章:

javascript - 如何更改 Sails JS 中间件的默认配置

node.js - 进行异步调用的 Express 中间件

vue.js - 如何在 vue-router 上重定向之前执行异步代码?

reactjs - 在 supabase js 查询中获取计数并指定范围

http - 从外部 Go 中间件控制 HTTP header

node.js - 如何将附加参数传递给 passport.authenticate

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

reactjs - 动态服务器错误 : Dynamic server usage: headers in NEXTJS 13. 3

next.js - 使用浏览器前进按钮访问通过链接访问的页面时,选项卡卡住

javascript - NextJS 13 更新服务器组件数据