bug: Custom OIDC (ADFS) login fails with PrismaClientValidationError: Unknown argument `resource` during account creation

这个报错通常出现在 Langfuse 自托管环境配合自定义 OIDC(如 Microsoft ADFS)登录时,ADFS 令牌响应里携带的 resource 等字段未被过滤就传给了 Prisma 的 prisma.account.create() ,导致校验失败。优先排查并配置环境变量 AUTH_I

快速结论:这个报错通常出现在 Langfuse 自托管环境配合自定义 OIDC(如 Microsoft ADFS)登录时,ADFS 令牌响应里携带的 resource 等字段未被过滤就传给了 Prisma 的 prisma.account.create(),导致校验失败。优先排查并配置环境变量 AUTH_IGNORE_ACCOUNT_FIELDS=resource

适用环境:Langfuse 3.199.0(Docker 镜像 langfuse/langfuse:3.199.0),自托管部署,自定义 OIDC 提供商为 Microsoft ADFS,认证配置使用了 AUTH_CUSTOM_CLIENT_IDAUTH_CUSTOM_CLIENT_SECRETAUTH_CUSTOM_ISSUERAUTH_CUSTOM_NAMEAUTH_CUSTOM_ID_TOKEN=trueAUTH_CUSTOM_CLIENT_AUTH_METHOD=client_secret_basic。数据库迁移已是最新状态。

最快修复方案:在部署环境中添加环境变量 AUTH_IGNORE_ACCOUNT_FIELDS=resource,重启服务后再尝试登录。若后续还有其他非 Prisma Account 模型字段,可继续用逗号分隔追加(例如 AUTH_IGNORE_ACCOUNT_FIELDS=resource,some_other_field)。该方案已在 Issue 讨论中被官方助手确认有效。

注意事项:该方案依赖 Langfuse 内置的 AUTH_IGNORE_ACCOUNT_FIELDS 过滤机制,仅适用于自定义 OIDC 提供商返回了 Prisma Account 模型之外的字段这一场景。Issue 中尚未验证其他 ADFS 特有字段(如 refresh_token_expires_in)是否必然需要一并过滤,若后续仍报错,可尝试按同样方式追加到该环境变量。目前没有证据表明该问题与数据库 schema 或迁移有关。

问题场景

用户部署 Langfuse 3.199.0(自托管),通过 Microsoft ADFS 作为自定义 OIDC 提供商配置了 SSO 登录。整个认证流程在 ADFS 侧成功完成,但 Langfuse 接收 OAuth 回调并尝试创建 Account 记录时触发 Prisma 校验错误,导致用户无法登录。

报错原文

[next-auth][error][OAUTH_CALLBACK_HANDLER_ERROR]

Invalid `prisma.account.create()` invocation:

data: {
  provider: "custom",
  type: "oauth",
  providerAccountId: "...",
  access_token: "...",
  token_type: "bearer",
  expires_at: 1785834995,
  resource: "...",
  refresh_token: "...",
  refresh_token_expires_in: 22775,
  scope: "profile email openid",
  id_token: "...",
  userId: "..."
}

Unknown argument `resource`.

原因分析

ADFS 的令牌响应中包含了 Microsoft 特有字段(如 resourcerefresh_token_expires_in)。Langfuse 在持久化 OAuth Account 记录时,没有过滤这些提供商特有的字段,而是直接传递给 prisma.account.create()。由于 Prisma Account 模型中不存在 resource 列,Prisma 在校验参数时抛出 PrismaClientValidationError,导致登录失败。核心原因在于 OAuth 账户持久化层未对 provider 返回的 token response 字段做过滤。

环境排查

  • 确认 Langfuse 版本为 3.199.0(Docker 镜像 langfuse/langfuse:3.199.0)。
  • 确认数据库迁移已执行且 Account 表结构与当前 schema 一致。
  • 确认自定义 OIDC 提供商为 Microsoft ADFS,并核对上述 AUTH_CUSTOM_* 环境变量已正确配置。
  • 检查 ADFS 令牌响应中是否包含 resourcerefresh_token_expires_in 等额外字段。

解决步骤

  1. 登录 Langfuse 自托管服务器,找到部署所用的环境变量配置文件(如 docker-compose.yml.env 或 Kubernetes Secret)。
  2. 添加以下环境变量:
    AUTH_IGNORE_ACCOUNT_FIELDS=resource
  3. 如果 ADFS 令牌中还有其他不在 Prisma Account 模型中的字段(例如 refresh_token_expires_in),可用逗号分隔一并加入:
    AUTH_IGNORE_ACCOUNT_FIELDS=resource,refresh_token_expires_in
  4. 保存配置并重启 Langfuse 服务。
  5. 再次通过自定义 SSO 提供商尝试登录。

验证方法

重启服务后,使用 ADFS 自定义 OIDC 流程重新登录。若登录成功,且不再出现 PrismaClientValidationError: Unknown argument 'resource',则表示问题已解决。同时可检查 Langfuse 日志确认 prisma.account.create() 调用不再包含 resource 字段。

参考来源

langfuse/langfuse #15758

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 18306

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注