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

Firebase Auth通过OIDC创建用户缺失邮箱标识符问题咨询

解决Firebase Auth OIDC身份提供商邮箱标识符缺失问题

一、明确Firebase的OIDC邮箱读取规则

Firebase Auth不会仅通过UserInfo响应获取邮箱作为用户标识符,它优先读取ID Token顶层的email和email_verified声明——即使UserInfo返回了这两个字段,只要ID Token里没有,Firebase就不会自动将邮箱设置为用户标识符。

所需的核心配置:

  • 必须请求的Scope:openid(OIDC强制要求) + email
  • ID Token中必须包含的声明:
    • email:用户的邮箱地址
    • email_verified:布尔值,标记邮箱是否已验证

二、针对性解决方法

1. 协调OIDC身份提供商(OP)调整配置

  • 要求OP在颁发的ID Token中直接嵌入email和email_verified声明,而不是仅在UserInfo响应中返回
  • 确认OP已正确配置email Scope的映射逻辑:当授权流程中请求email Scope时,ID Token必须携带上述两个声明

2. 客户端/服务端侧的补位方案(OP无法修改ID Token时)

如果OP无法调整ID Token输出,可以通过Firebase云函数的用户创建触发器,手动同步UserInfo中的邮箱到Firebase用户记录:

const functions = require("firebase-functions");
const admin = require("firebase-admin");
admin.initializeApp();

exports.syncOidcUserEmail = functions.auth.user().onCreate(async (user) => {
  // 定位OIDC提供商的认证数据
  const oidcProvider = user.providerData.find(p => p.providerId === "oidc.<你的OP提供商唯一标识>");
  if (!oidcProvider?.accessToken) return;

  // 调用OP的UserInfo端点获取邮箱信息
  const userInfoRes = await fetch("<OP的UserInfo端点URL>", {
    headers: { Authorization: `Bearer ${oidcProvider.accessToken}` }
  });
  const userInfo = await userInfoRes.json();

  // 更新Firebase用户的邮箱字段
  if (userInfo.email) {
    await admin.auth().updateUser(user.uid, {
      email: userInfo.email,
      emailVerified: userInfo.email_verified ?? false
    });
  }
});
  • 注意:请替换代码中的<你的OP提供商唯一标识>和<OP的UserInfo端点URL>为实际值,同时确保云函数有访问OP端点的网络权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 14:11:03