You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 09:16:35