如何在Next.js 13 Beta应用目录的服务器组件中使用NextAuth getServerSession
在Next.js 13 App目录服务器组件中获取NextAuth用户ID
在Next.js 13 App Router的服务器组件中,不需要传入req和res对象给getServerSession,NextAuth v4.22.0及以上版本已适配App Router,直接传入authOptions即可获取会话信息。
步骤1:确认NextAuth版本
确保你的next-auth版本在4.22.0或更高,可查看package.json确认,版本过低则执行升级:
npm update next-auth
步骤2:修改服务器组件代码
直接调用getServerSession并传入authOptions,从返回的会话对象中提取用户ID:
import { getServerSession } from "next-auth"; import { authOptions } from "@/pages/api/auth/[...nextauth]"; const Test = async () => { // 无需req/res,直接传入authOptions获取会话 const session = await getServerSession(authOptions); if (!session) { // 处理未登录场景 return <div>请先登录</div>; } // 从session中提取用户ID const user_id = session.user.id; console.log("当前用户ID:", user_id); return ( <div>当前用户ID:{user_id}</div> ); }; export default Test;
步骤3:确保authOptions配置正确
在[...nextauth].js的authOptions中配置回调,保证用户ID被包含在会话里:
// pages/api/auth/[...nextauth].js import NextAuth from "next-auth"; // 导入你使用的认证提供者,比如CredentialsProvider import CredentialsProvider from "next-auth/providers/credentials"; export const authOptions = { providers: [ CredentialsProvider({ // 你的认证逻辑,比如从数据库校验用户 async authorize(credentials) { const user = await getUserByCredentials(credentials); if (user) { // 返回包含id的用户对象 return { id: user.id, name: user.name, email: user.email }; } return null; } }) ], session: { strategy: "jwt", // 默认策略 }, callbacks: { async session({ session, token }) { // 将token中的用户ID同步到session session.user.id = token.sub; return session; }, async jwt({ token, user }) { // 用户登录时,把ID存入token if (user) { token.sub = user.id; } return token; } } }; export default NextAuth(authOptions);
注意事项
- 若使用
database会话策略,session.user会自动包含用户ID,无需额外在session回调中处理。 - 服务器组件在服务端执行,会话信息直接从请求上下文获取,不会触发客户端交互。
内容的提问来源于stack exchange,提问作者Shakib Hasan
相关产品推荐
相关产品推荐

