如何在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
相关产品推荐
相关产品推荐

