使用 next auth 进行 Oauth 时,getServerSession 始终在 nextjs 13.5.2 api 路由处理程序中返回 null
2023-09-25
733
`我目前正在开发一个 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:响应主体对象不应被干扰或锁定 在 extractBody
有人可以帮我解决这个问题吗?
谢谢。
你的文字
`
2个回答
我遇到了同样的问题,我降级到 13.5.2,现在它运行良好。
Alidotm
2023-09-26
如 此处 所述,问题在于会话数据存储在 cookie 中,并且仅当从浏览器发出请求时 cookie 才可用,因此如果您升级,则必须从组件发出请求
Vahé Khachaturian
2024-04-14