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

如何在NextAuth中获取MongoDB自动生成的默认ObjectId以操作用户文档

解决方案

你可以通过配置Next Auth的回调函数,将MongoDB生成的_id字段注入到会话对象中,全程不需要自定义额外ID:

步骤1:修改Next Auth配置的回调逻辑

在你的[...nextauth].js/[...nextauth].ts配置文件中,添加jwt和session两个回调:

  • 首先在jwt回调中,当用户首次登录时,把MongoDB返回的用户_id写入JWT令牌
  • 然后在session回调中,把JWT里存储的_id同步到返回给前端的session对象里
export const authOptions = {
  // 你的其他配置:providers、adapter等,确保已正确配置MongoDB Adapter
  adapter: MongoDBAdapter(clientPromise),
  callbacks: {
    async jwt({ token, user }) {
      // 首次登录时user参数存在,直接取MongoDB生成的_id
      if (user) {
        token.id = user._id
      }
      return token
    },
    async session({ session, token }) {
      // 把token里的id注入到session的user对象中
      if (session.user) {
        session.user.id = token.id
      }
      return session
    }
  }
}

步骤2:前端获取_id

配置完成后,前端用useSession()钩子就能直接拿到id值:

const { data: session } = useSession()
const userId = session?.user?.id // 这里拿到的就是MongoDB原生的ObjectId
// 发起PUT请求时直接将userId拼到接口URL中即可

可选:TypeScript类型适配

如果你使用TypeScript,需要扩展Next Auth的类型定义避免类型报错,在项目的types/next-auth.d.ts文件中添加以下声明:

import NextAuth, { DefaultSession } from "next-auth"

declare module "next-auth" {
  interface Session {
    user: {
      id: string
    } & DefaultSession["user"]
  }

  interface User {
    _id: string
  }
}

declare module "next-auth/jwt" {
  interface JWT {
    id: string
  }
}

服务端直接获取的方式

如果是在API路由或者服务端组件中需要拿到用户_id,可以直接用getServerSession方法读取,不需要前端传参,安全性更高:

import { getServerSession } from "next-auth/next"
import { authOptions } from "./auth/[...nextauth]"

export default async function handler(req, res) {
  const session = await getServerSession(req, res, authOptions)
  const userId = session?.user?.id
  // 直接用userId操作MongoDB即可
}

内容的提问来源于stack exchange,提问作者Eric Pezzulo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 04:06:02