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

