为何新注册用户首次登录后刷新页面Firebase令牌会过期?
针对你遇到的新用户首次登录Microsoft认证后刷新页面丢失Firebase登录状态的问题,核心原因大概率和新用户会话的持久化完整性或Firebase用户记录同步延迟有关,具体可能是以下几种情况:
会话持久化未完成就跳转:首次登录新用户时,
signInWithCustomToken是异步操作,需要完成ID token和refresh token的获取与本地存储。如果用户输入验证码后,你还没等这个异步操作完全结束就跳转页面,客户端可能只存了短期的ID token,没拿到refresh token。刷新页面时,ID token可能刚好过期(或因无refresh token无法自动刷新),导致accounts:lookup请求返回TOKEN_EXPIRED,最终用户状态变为null。而二次登录时用户已存在,会话存储流程能完整走完,refresh token正常保存,刷新时可自动续期。新用户记录同步延迟:Firebase首次创建用户时,用户数据在服务器节点间的同步存在短暂延迟。刷新页面时,处理
accounts:lookup请求的服务器还没同步到这个新用户的记录,就会返回TOKEN_EXPIRED的错误(错误信息可能不准确)。二次登录时用户数据已经完全同步,验证就能正常通过。自定义令牌过期时间设置错误:后端针对新用户生成自定义令牌时,可能误设了过短的过期时间(比如几秒),导致用户跳转后刷新时令牌已经失效。而二次登录时,后端生成令牌的逻辑用了正常的过期时间(默认1小时),所以不会出现问题。
Next.js SSR Hydration冲突:在Next.js的SSR模式下,首次登录后客户端Hydrate阶段,服务器初始状态是未登录,客户端尝试读取本地存储的token时,新用户的token还没完全写入,导致用了无效的token发起验证,最终状态被重置为null。二次登录时本地已有有效refresh token,能正常恢复登录状态。
内容的提问来源于stack exchange,提问作者GhostOrder

