Firebase Auth如何免重登获取当前用户的AuthCredential
当前系统架构与认证逻辑如下:
- 系统包含多款Web应用与原生应用,所有应用统一通过专用的Web认证应用(auth-web-app)完成用户身份校验
- 现有首次登录流程:专用auth-web-app引导用户完成登录后,将
credential.toJSON()的输出作为消息内容传递给发起调用的应用;调用方应用接收凭证后,通过OAuthCredential.fromJSON(...)在自身进程内完成身份认证 - 用户完成首次认证后,中心auth-web-app会持久保留用户登录状态,该环境下
auth.currentUser始终为有效值 - 场景逻辑可参考对应演示视频
当其他应用唤起auth-web-app时,应用内已存在登录态有效的用户,但无法从当前已登录用户对象检索或生成AuthCredential,无法将认证状态传递给调用方应用。需要实现无需用户重新登录,即可从当前已登录用户处获取可传递的认证凭证的方案。
不存在直接从持久化登录态的currentUser对象中提取原始首次登录返回的OAuthCredential的官方API——这类包含第三方平台访问密钥、刷新令牌的敏感凭证,SDK仅会在首次登录完成的回调中明文返回,持久化存储登录态时不会暴露可直接导出的原始凭证,避免跨站脚本攻击窃取敏感令牌。可根据你的业务场景选以下两种合规可行的实现方案:
方案1:基于ID Token生成通用凭证(推荐,适用于仅需完成自身系统认证的场景)
如果调用方应用拿到凭证仅用于完成自身系统内的用户身份校验,不需要用原始OAuth令牌访问第三方平台接口,用这个方案安全性最高、维护成本最低:
- 外部应用唤起auth-web-app后,首先校验
auth.currentUser是否存在 - 若存在有效登录用户,直接调用
await auth.currentUser.getIdToken(true)强制刷新获取用户最新的有效ID Token - 调用对应身份提供商的
OAuthProvider.credential()方法,传入拿到的ID Token生成标准OAuthCredential实例 - 调用实例的
toJSON()方法序列化成可跨上下文传递的字符串,按照现有消息通道回传给调用方应用即可
调用方应用拿到序列化后的凭证后,原有OAuthCredential.fromJSON(...)的解析逻辑不需要做任何修改即可正常完成认证。
方案2:持久化首次登录凭证(适用于需要传递原始OAuth令牌的场景)
如果你的业务需要把包含第三方平台accessToken、refreshToken的完整原始凭证传递给调用方,用于调用第三方平台开放接口,只需要在首次登录节点增加凭证持久化逻辑即可:
- 用户首次在auth-web-app完成登录、拿到
OAuthCredential实例的节点,除了完成当前应用的登录流程,立刻将credential.toJSON()的序列化结果加密存储在auth-web-app同源下的持久化存储中(推荐用带完整性校验的IndexedDB存储,不要存在明文localStorage) - 后续外部应用唤起auth-web-app时,只要检测到
auth.currentUser为有效状态,直接读取本地存储的持久化凭证回传给调用方即可 - 增加凭证更新逻辑:每次用户主动重新登录、检测到凭证过期、用户主动更新第三方平台授权范围时,同步更新本地存储的凭证内容,避免回传失效凭证
安全注意:必须给auth-web-app的消息接收逻辑增加可信来源校验,仅响应预先登记过的可信域名、原生应用包名发来的凭证请求,禁止给任意来源的调用方回传凭证,避免敏感令牌被恶意站点窃取。
避坑提示
不要尝试读取Auth SDK内部缓存的私有属性提取凭证:SDK内部存储结构会随版本迭代频繁变动,且不同运行环境(普通浏览器、iOS/Android WebView)下的存储逻辑不一致,强行读取私有属性会导致版本升级后功能不可用,同时存在敏感数据泄露的合规风险。
内容的提问来源于stack exchange,提问作者Yairopro

