Firebase如何判断用户身份验证的登录提供方是否被其他提供方覆盖
解决方案
一、关于监听登录提供方覆盖事件
Firebase Auth没有提供客户端侧直接监听「提供方被覆盖」的事件接口,你可以采用两种方案解决旧文档同步问题:
- 优先沿用你现有处理逻辑:在第三方登录流程中,提前获取账号邮箱,调用
callUserOnCheck删除未验证的邮箱密码账号对应的错误文档,这个方案没有数据残留的时间差,可靠性更高。 - 服务端兜底方案:给Firebase Auth配置
user.onCreate触发器,或者给Firestore的user-document配置onUpdate触发器,每次账号信息变动时,服务端自动校验:如果账号存在未验证的邮箱密码提供方,同时新增了Google/微软/脸书这类可信第三方提供方,就直接用第三方返回的最新用户信息覆盖旧的错误文档,服务端逻辑不受客户端篡改影响,安全性更高。
二、微软登录TODO问题解决
你不需要在调用Firebase登录接口前获取微软邮箱,调整流程顺序即可:
首先构造Microsoft OAuth提供方时显式声明email权限,确保能拿到账号邮箱:
val microsoftOAuth = OAuthProvider.newBuilder("microsoft.com") .setScopes(listOf("email", "openid", "profile")) .build()
然后调整登录逻辑,在拿到Firebase登录结果后,先提取邮箱调用校验接口处理旧文档,再执行用户文档创建逻辑:
override fun signInWithMicrosoft(activity: Activity): Flow<LoginStateEvent> = flow { val result = dbAuth.pendingAuthResult?.await() ?: dbAuth.startActivityForSignInWithProvider( activity, microsoftOAuth.build() ).await() // 提取微软返回的邮箱,调用校验接口删除未验证的旧文档 val email = result.user?.email ?: throw Exception("无法获取微软账号邮箱") callUserOnCheck(email) createUserIfNotExist(UserNetworkEntity(fullName = result.user!!.displayName!!)) }
这个方案和你Google、脸书的逻辑效果完全一致:callUserOnCheck会删除同邮箱下未验证的邮箱密码账号对应的错误Firestore文档,之后调用createUserIfNotExist时,会判断文档已被删除,自动用微软返回的正确信息创建新的用户文档。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

