在使用 next auth 进行 Oauth 时,getServerSession 在 nextjs 13.5.2 api 路由处理程序中始终返回 null

问题描述 投票:0回答:2

`我目前正在开发一个 To-Do 应用程序来练习 Next.js 和 Next-Auth。我正在使用 Next-Auth 作为 OAuth 提供程序,并且我想为每个具有相应用户 ID 的待办事项添加一个“createdBy”属性。这将允许我获取特定用户的待办事项。但是,我在检索 API 路由中当前用户的详细信息时遇到问题,因为“getServerSession”函数始终返回 null。

这是我的下一个身份验证设置

import { authOptions } from '@/lib/auth-options'
import NextAuth from 'next-auth'


const handler = NextAuth(authOptions)

export {handler as GET,handler as POST}

这是我的authOptions

import { type NextAuthOptions } from "next-auth";
import GithubProvider from "next-auth/providers/github";
import { getAuthCredentials } from "./secrets";
export const authOptions: NextAuthOptions = {
  providers: [
    GithubProvider({
      clientId: getAuthCredentials().clientId,
      clientSecret: getAuthCredentials().clientSecret,
    }),
  ],
  secret: getAuthCredentials().secret,
  session: {
    strategy: "jwt",
  },
  callbacks: {
    jwt: ({ token, user, session }) => {
      if (user) {
        token.id = user.id;
      }
      return token;
    },
    session: ({ session, token }) => {
      if (token?.id) {
        session.user.id = token.id;
      }
      return session;
    },
  },
  pages: {
    signIn: "/signin",
    signOut: "/signout",
  },
};

在服务器组件中使用 getServerSession(authOptions) 工作正常 在客户端组件中使用 useSession() 也工作正常

但在 api 路由中它返回 null

这是我用于创建待办事项的 api 路由处理程序 // api/todos

export async function POST(req: NextRequest) {
  let body = await req.json();
  const session = await getServerSession(authOptions);
  console.log({ session });
  // {session : null}
  let validateBody = addTodoSchema.safeParse(body);
  console.log({ validateBody });
  if (!validateBody.success) {
    return NextResponse.json({
      success: false,
      error: validateBody.error,
    });
  }
  try {
    await connectToDatabase();
    let todo = await prisma.todo.create({
      data: {
        ...body,
        createdBy: session?.user.id,
      },
    });
    return NextResponse.json({
      success: true,
      data: todo,
      message: "Todo created successfully",
    });
  } catch (error: any) {
    console.log({ error });
    return NextResponse.json({
      success: false,
      error: error.message,
    });
  } finally {
    await prisma.$disconnect();
  }
}

这是向上述端点发出请求的代码

"use server";
import { headers } from "next/headers";
export const addTodo = async ({ title }: { title: string }) => {
  try {
    let res = await fetch("http://localhost:3000/api/todos", {
      method: "POST",
      headers: headers(),
      body: JSON.stringify({
        title,
      }),
    });
    let data = await res.json();
    console.log({ data });
  } catch (error: any) {
    console.log({ error });
    // throw new Error(error.message);
  }
};

单击“提交”时,我正在传递表单中的标题 在上面的代码中我添加了 headers() 我在某处看到它但它仍然不起作用

我在终端中收到此错误

⨯ TypeError:响应主体对象不应被干扰或锁定 在提取体

有人可以帮我吗?

谢谢你。

your text

`

next.js next-auth
2个回答
0
投票

我遇到了同样的问题,我降级到 13.5.2 现在对我来说工作正常。


0
投票

here中所述,问题是会话数据存储在cookie中,并且cookie仅在从浏览器发出请求时才可用,因此如果您升级,则必须从组件发出请求

© www.soinside.com 2019 - 2024. All rights reserved.