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

如何在NextAuth+Prisma Adapter中手动设置AzureAD用户ID?

解决NextAuth Prisma Adapter手动指定用户ID的问题

问题原因

NextAuth的Prisma Adapter默认会自动生成用户ID(通常为UUID),即使你在profile函数中返回了id字段,也会被忽略——因为Adapter的默认创建逻辑不会使用该值。

解决方案:用createUser回调覆盖默认创建逻辑

通过NextAuth的callbacks.createUser回调,手动调用Prisma创建用户,直接传入从AzureAD获取的oid作为用户ID。

步骤1:修改AuthOptions配置

在authOptions中添加callbacks配置,实现自定义用户创建逻辑:

import { type AuthOptions } from 'next-auth'
import type { User } from '@prisma/client'
import { originalPrisma } from 'lib/prisma'
import AzureADProvider from 'next-auth/providers/azure-ad'

const scope = 'openid profile email'

export const authOptions: AuthOptions = {
  adapter: PrismaAdapter(originalPrisma),
  session: {
    strategy: 'jwt',
  },
  callbacks: {
    async createUser(user) {
      // 手动创建用户,使用profile返回的id(即AzureAD的oid)
      return await originalPrisma.user.create({
        data: {
          id: user.id,
          name: user.name,
          email: user.email,
          emailVerified: user.emailVerified,
          image: user.image,
        },
      })
    },
  },
  providers: [
    AzureADProvider({
      clientId: process.env.AZURE_AD_CLIENT_ID!,
      clientSecret: process.env.AZURE_AD_CLIENT_SECRET!,
      tenantId: process.env.AZURE_AD_TENANT_ID!,
      authorization: { params: { scope } },
      idToken: true,
      async profile(profile, tokens) {
        return {
          id: profile.oid!,
          name: profile.name,
          email: profile.email,
          emailVerified: profile.email_verified || null,
          image: null,
        }
      },
    }),
  ],
}

步骤2:确认Prisma Schema配置

确保你的Prisma Schema中User模型的id字段支持手动赋值:

  • 如果id是字符串类型,即使设置了@default(uuid()),手动传入值时会自动覆盖默认值;
  • 若不需要自动生成ID,可以去掉@default(uuid()),强制必须手动传入ID。

示例Schema:

model User {
  id            String    @id @default(uuid()) // 保留默认,手动传值会覆盖
  name          String?
  email         String?   @unique
  emailVerified DateTime?
  image         String?
  accounts      Account[]
  sessions      Session[]
}

注意事项

  • 确保AzureAD返回的oid全局唯一,避免数据库唯一键冲突;
  • createUser回调仅在用户首次登录时触发,后续登录不会执行该逻辑;
  • 若使用jwt会话策略,无需额外调整会话逻辑,NextAuth会自动使用自定义的用户ID。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 11:30:01