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

Firebase Auth中Microsoft与OIDC-Microsoft登录用户ID不一致问题

Firebase自定义OIDC提供商:将providerData的uid改为Microsoft oid的解决方案

Firebase的自定义OIDC提供商没有直接的配置选项可以将providerData条目中的uid从默认的sub声明改为Microsoft的oid——因为Firebase硬编码了使用OIDC ID Token的sub字段作为providerData的uid值。不过可以通过以下两种可靠方式解决你的需求:

方案1:将oid存储到用户自定义Claims中(推荐)

通过Firebase Auth云函数,在用户首次创建或登录时,提取ID Token中的oid并存储到用户的自定义Claims里,后续调用Microsoft Graph API时直接读取该值即可:

步骤1:编写云函数触发器

创建auth.user().onCreate和auth.user().onSignIn触发器,确保oid始终同步:

const functions = require("firebase-functions");
const admin = require("firebase-admin");
const jwt = require("jsonwebtoken");

admin.initializeApp();

// 新用户创建时同步oid
exports.syncOidOnUserCreate = functions.auth.user().onCreate(async (user) => {
  await syncMicrosoftOid(user);
});

// 用户每次登录时同步oid(可选,防止oid意外变更)
exports.syncOidOnSignIn = functions.auth.user().onSignIn(async (user) => {
  await syncMicrosoftOid(user);
});

async function syncMicrosoftOid(user) {
  // 找到自定义OIDC提供商的登录记录
  const oidcProviderEntry = user.providerData.find(p => p.providerId === "oidc.your-provider-id");
  if (!oidcProviderEntry?.rawId) return;

  // 解析并验证ID Token(建议验证签名确保数据可信)
  const decodedToken = jwt.decode(oidcProviderEntry.rawId, { complete: true });
  const oid = decodedToken?.payload?.oid;
  if (!oid) return;

  // 将oid写入自定义Claims
  await admin.auth().setCustomUserClaims(user.uid, {
    microsoftOid: oid
  });
}

步骤2:读取oid调用Graph API

  • 在后端:通过admin.auth().getUser(uid)获取用户信息,从customClaims.microsoftOid读取oid。
  • 在客户端:调用user.getIdTokenResult(),从tokenResult.claims.microsoftOid读取oid。

方案2:修改Azure AD的sub声明映射(谨慎使用)

如果你的业务场景允许修改Azure AD的sub声明含义,可以在Azure门户中将sub映射为oid的值:

  • 登录Azure门户,进入目标应用注册 → 令牌配置 → 添加可选声明
  • 选择ID令牌,勾选oid确保其包含在ID Token中
  • 添加自定义声明:创建一个将sub映射为oid的规则

⚠️ 注意:此操作会改变sub声明的原有含义(从用户+应用唯一变为用户全局唯一),可能违反OIDC规范,且会影响所有依赖sub的集成功能,仅在无其他依赖场景下使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 14:37:43