如何区分Firebase Auth中通过Admin SDK与手机号创建的用户?
区分Firebase中Admin SDK创建用户与手机号认证用户的方案
当然可以区分,这里给你两种最可靠的实现方式,适配你的场景:
方法一:使用自定义用户声明(Custom Claims)【推荐】
直接在创建管理员时给用户打上专属标记,这是最清晰、最不易混淆的方式,还能顺便用于后续的权限控制。
修改你的管理员创建函数
在创建用户后添加自定义声明:
exports.addAdmin = functions.https.onCall(async (data, context) => { const userRecord = await admin.auth().createUser({ email: data.email, password: data.password, displayName: data.name, phoneNumber: data.phone, disabled: false, emailVerified: true }); // 添加管理员专属声明 await admin.auth().setCustomUserClaims(userRecord.uid, { isAdmin: true }); return { uid: userRecord.uid, message: "管理员账号创建成功" }; });
在onCreate触发器中区分用户
直接读取自定义声明判断用户类型:
exports.sendRegistrationSMS = functions.auth.user().onCreate(async (user) => { const isAdmin = user.customClaims?.isAdmin === true; if (isAdmin) { // 发送管理员专属注册短信 await sendSMS(user.phoneNumber, `您好,管理员账号已创建完成,登录邮箱:${user.email}`); } else { // 发送标准用户注册短信 await sendSMS(user.phoneNumber, "欢迎注册,您的账号已成功开通!"); } }); // 示例短信发送函数(替换为你的实际短信服务逻辑) async function sendSMS(phoneNumber, message) { // 这里调用你的短信服务商API,比如Twilio、阿里云短信等 console.log(`短信已发送至${phoneNumber}:${message}`); }
方法二:通过认证提供者(Provider Data)判断
如果不想使用自定义声明,也可以通过用户的认证来源区分:
- Admin SDK创建的邮箱密码用户,
providerData中会包含password类型的提供者 - 手机号认证注册的用户,
providerData中会包含phone类型的提供者
触发器中的判断逻辑
exports.sendRegistrationSMS = functions.auth.user().onCreate(async (user) => { // 判断是否为Admin SDK创建的管理员(邮箱密码认证) const isAdmin = user.providerData.some(provider => provider.providerId === 'password'); // 判断是否为手机号注册的标准用户 const isStandardUser = user.providerData.some(provider => provider.providerId === 'phone'); if (isAdmin) { await sendSMS(user.phoneNumber, `您好,管理员账号已创建完成,登录邮箱:${user.email}`); } else if (isStandardUser) { await sendSMS(user.phoneNumber, "欢迎注册,您的账号已成功开通!"); } });
注意事项
这种方法的局限性在于:如果后续给标准用户绑定了邮箱密码,或者给管理员绑定了手机号,providerData会包含多种类型,此时就需要结合其他条件(比如是否有邮箱且emailVerified为true)来辅助判断,不如自定义声明可靠。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

