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已正确配置
emailScope的映射逻辑:当授权流程中请求emailScope时,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
相关产品推荐
相关产品推荐

