如何实现主域与子域站点的Firebase Authentication登录状态共享?
同根域名Flutter Web + Firebase Auth 单点登录实现方案
优先方案:根域名Cookie共享认证状态(复杂度最低,无需改动业务逻辑)
该方案完全不需要用到Custom Token,适配你现有认证逻辑的成本极低,核心原理是替换Firebase Auth的默认存储介质:
- Firebase Auth Web端默认将用户认证凭证存储在
localStorage中,该存储遵循同源策略,无法跨子域读取 - 你可以自定义Firebase Auth的持久化实现,将认证凭证改为存储在根域名Cookie中:Cookie的
Domain属性设置为.你的主域名.com,同时配置Secure=true(强制HTTPS场景下可读)、SameSite=Lax、HttpOnly=false(前端可读写) - 两个站点的Firebase初始化参数完全一致(共用同一项目),同时都接入这套自定义Cookie持久化逻辑即可:用户在任意站点登录后,认证凭证会写入根域名Cookie,另一站点初始化时自动读取有效凭证,直接识别为已登录状态
- Flutter侧的
firebase_auth包的authStateChanges()监听、登录/登出逻辑完全不需要改动,适配成本几乎为零
备选方案:Custom Token 实现(适合有自定义认证规则的场景)
如果有额外的权限校验需求,可选择该方案,复杂度高于前者,需要部署后端服务(可直接用Firebase Cloud Functions):
- 实现步骤:
- 用户在A站点完成登录后,请求后端接口,传入当前用户的ID Token
- 后端使用Firebase Admin SDK校验ID Token有效性后,调用
createCustomToken(uid)生成对应该用户的自定义Token,返回给前端 - 前端将自定义Token写入根域名Cookie
- 用户访问B站点时,初始化阶段先读取根域名Cookie中的自定义Token,存在则调用
signInWithCustomToken()完成自动登录,登录成功后立即删除Cookie中的自定义Token避免泄露 - 登出逻辑需要同步清除两个站点的本地存储、以及根域名Cookie中的相关凭证
注意事项
- 两个站点必须全量使用HTTPS协议,避免认证凭证明文传输泄露
- 根域名Cookie的
Domain属性配置必须准确,例如主域为abc.com时填写.abc.com,确保主域、所有子域都可正常读取 - 采用Cookie存储方案时注意单Cookie大小上限为4KB,Firebase Auth的用户凭证数据远小于该阈值,不会出现溢出问题
内容的提问来源于stack exchange,提问作者Iducool
相关产品推荐
相关产品推荐

