Flutter中如何判断Firebase用户是手机号还是邮箱密码登录
Flutter中判断Firebase登录方式的实现方案
你之前用的authStateChanges监听、currentUser判空逻辑只能校验用户是否处于登录态,要区分当前用户是通过邮箱密码登录还是手机号登录,直接读取Firebase User对象自带的providerData属性即可实现。
核心判断逻辑
Firebase会在用户对象的providerData列表中存储该账号绑定的所有登录凭证信息,每个凭证对应唯一的providerId标识:
- 邮箱密码登录的
providerId固定值为password - 手机号验证码登录的
providerId固定值为phone
可直接复用的代码实现
首先定义登录类型枚举,再写通用的判断方法:
enum LoginType { emailPassword, // 邮箱密码登录 phone, // 手机号登录 notLoggedIn, // 未登录 unknown // 其他登录方式 } LoginType getCurrentUserLoginType() { final User? currentUser = FirebaseAuth.instance.currentUser; if (currentUser == null) { return LoginType.notLoggedIn; } for (final UserInfo providerInfo in currentUser.providerData) { switch (providerInfo.providerId) { case 'password': // 校验凭证绑定了有效邮箱,避免和其他密码类凭证混淆 if (providerInfo.email?.trim().isNotEmpty ?? false) { return LoginType.emailPassword; } break; case 'phone': // 校验凭证绑定了有效手机号 if (providerInfo.phoneNumber?.trim().isNotEmpty ?? false) { return LoginType.phone; } break; } } return LoginType.unknown; }
补充说明
- 不要直接读取
currentUser.email或currentUser.phoneNumber顶层字段判断:如果用户同时绑定了邮箱和手机号,顶层字段会同时有值,无法区分本次实际使用的登录渠道。 - 如果需要在登录操作完成的瞬间就拿到登录类型,不需要等全局状态同步,可以直接从登录返回的
UserCredential对象中读取:// 邮箱密码登录后读取 final UserCredential emailCred = await FirebaseAuth.instance.signInWithEmailAndPassword(/* 传入参数 */); final loginProvider = emailCred.credential?.providerId; // 值为'password' // 手机号登录后读取 final UserCredential phoneCred = await FirebaseAuth.instance.signInWithCredential(/* 传入手机凭证 */); final loginProvider = phoneCred.credential?.providerId; // 值为'phone' - 如果后续接入Google、Apple等第三方登录,同样可以通过判断
providerId(Google对应google.com、Apple对应apple.com)识别登录方式。
内容的提问来源于stack exchange,提问作者taha khamis
相关产品推荐
相关产品推荐

