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

如何在Firebase Authentication + OIDC中使用非email作为用户标识符?

解决Firebase Auth使用OIDC提供商时的重复邮箱用户冲突问题

核心结论

Firebase Authentication支持使用OIDC ID Token中的sub字段作为用户唯一标识符,无需强制依赖邮箱。你可以通过调整Firebase的OIDC提供商配置或自定义登录流程实现,同时确保你的OIDC提供商返回符合规范的sub字段即可。


方案一:直接调整Firebase OIDC提供商配置

大部分情况下,Firebase控制台允许你指定OIDC提供商的用户标识符来源:

  1. 登录Firebase控制台,进入「Authentication」→「登录方法」
  2. 找到已配置的OIDC提供商,点击「编辑」
  3. 在配置项中寻找「用户标识符」或类似选项,选择以sub字段作为唯一标识(替代默认的email)
  4. 保存配置后,Firebase将优先使用ID Token中的sub来创建/匹配用户,即使多个用户邮箱相同,只要sub唯一就会被视为独立用户

方案二:通过Firebase Admin SDK自定义登录流程

如果Firebase控制台没有上述配置选项,可通过后端自定义处理逻辑:

  • 前端从你的OIDC提供商获取ID Token后,将其发送到你的ASP.NET后端服务
  • 后端使用Firebase Admin SDK验证该ID Token的合法性,提取其中的sub字段
  • 调用Admin SDK的GetUserByProviderUidAsync方法,传入你的OIDC提供商ID和sub值,检查用户是否已存在
    • 若不存在:调用CreateUserAsync创建新用户,指定ProviderData中的ProviderUid为sub,同时保留邮箱字段
    • 若存在:直接生成Firebase自定义令牌返回给前端,让前端完成登录

示例代码(C#):

// 验证OIDC ID Token(此处省略你的OIDC验证逻辑)
var oidcToken = await ValidateOidcTokenAsync(oidcTokenString);
var sub = oidcToken.Claims.First(c => c.Type == "sub").Value;
var providerId = "your-oidc-provider-id"; // 对应Firebase中配置的OIDC提供商ID

// 检查Firebase中是否存在该用户
UserRecord user;
try
{
    user = await FirebaseAuth.DefaultInstance.GetUserByProviderUidAsync(providerId, sub);
}
catch (FirebaseAuthException ex) when (ex.ErrorCode == AuthErrorCode.UserNotFound)
{
    // 创建新用户
    var userArgs = new UserRecordArgs
    {
        Email = oidcToken.Claims.FirstOrDefault(c => c.Type == "email")?.Value,
        ProviderData = new List<UserInfo>
        {
            new UserInfo
            {
                ProviderId = providerId,
                Uid = sub
            }
        }
    };
    user = await FirebaseAuth.DefaultInstance.CreateUserAsync(userArgs);
}

// 生成Firebase自定义令牌返回给前端
var customToken = await FirebaseAuth.DefaultInstance.CreateCustomTokenAsync(user.Uid);

OIDC提供商(ASP.NET Identity + OpenIDDict)的配置要求

你只需要确保OpenIDDict返回的ID Token符合OIDC规范:

  • 必须包含唯一的sub字段(这是OIDC的强制要求,OpenIDDict默认已实现,只需确认你的用户系统中每个用户的sub唯一即可)
  • 无需额外配置告知Firebase使用哪个字段,只要Firebase端设置为优先使用sub即可

注意事项

  • 若之前已有用户通过邮箱关联到Firebase,需要手动迁移这些用户的ProviderData,将ProviderUid更新为对应的sub值,避免后续登录冲突
  • 确保你的OIDC提供商不会重复生成sub值,sub必须是每个用户的全局唯一标识

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 04:47:05