javascript 如何在next.js 14中获取服务器端的会话对象?

yruzcnhs  于 2023-11-15  发布在  Java
关注(0)|答案(2)|浏览(219)

我使用的是next.js 14的版本,带有应用程序路由功能和NextAuth。
我希望保护API,但在http://localhost:3000/api/user/clotdcsk0001kvjmg8bvbkxy7上使用Postman请求受保护的端点时,使用getServerSession( authOptions )方法时得到了一个null对象。
我尝试在请求的授权部分传递一个承载令牌,也就是next-auth.session-token cookie,这使得通过中间件保护并命中端点成为可能,但我无法在GET方法中获取会话对象以进行自定义逻辑。
这是我的/api/user/[id]/route.ts文件。

export async function GET ( req : NextRequest, ds : DynamicSegment ) {

   const session = await getServerSession( options )

   console.log(session) //prints null
   
   // Custom logic to handle the request...
  
}

字符串
如果我使用相同的方法,在page.tsx文件中使用getServerSession方法来获取会话对象,它可以正常工作(通过资源管理器)。

vjhs03f7

vjhs03f71#

我发现,当从浏览器或 Postman 调用时,应该在请求中传递next-auth.session-token的cookie。

let response = await fetch(`/api/users/${userId}`, {
  method: "GET",
  headers: { 
    "Content-Type": "application/json",
    "Cookie": `next-auth.session-token=${sessionToken};path=/;expires=Session`    
  },
   cache: 'no-store',
});

字符串
其中,sessionToken是从
page.tsx

import { cookies } from 'next/headers'
   
   // ...
   
   // Get sessionToken object
   const cookieStore = cookies()
   let sessionTokenCookie = cookieStore.get('next-auth.session-token')
   let sessionToken = sessionTokenCookie.value;

wfsdck30

wfsdck302#

你可以试试这个

// Next auth
export const handler = NextAuth(authOptions);
export { handler as GET, handler as POST };

// page.js 
import { authOptions } from "../api/auth/[...nextauth]/route";

const session = await getServerSession(authOptions);

字符串

相关问题