Firebase signInWithRedirect跳转登录后getRedirectResult始终返回null问题求助
兄弟,我来帮你捋捋这个问题!你用Firebase的signInWithRedirect跳转登录后,getRedirectResult一直返回null,大概率是这几个地方出问题了,咱们一个个排查:
Firebase Auth实例初始化时机不对:你得确保
auth实例是在组件挂载前就完全初始化好的全局单例,要是getRedirectResult在auth还没准备好的时候就调用了,那肯定拿不到跳转后的结果。比如别在组件内部临时创建auth实例,要在项目入口或者专门的Firebase配置文件里初始化好再导入使用。浏览器隐私设置影响:现在很多浏览器默认会阻止第三方Cookie,Firebase的跳转登录依赖第三方Cookie来保存会话信息,要是这个开关开着,跳转回来后Firebase就拿不到登录状态,自然
getRedirectResult返回null。你可以先试试关闭浏览器的“阻止第三方Cookie”设置,测试下能不能拿到结果。代码执行时机与路由干扰:你的
useEffect依赖只有navigate,但如果跳转回来后,路由变化导致组件还没执行checkRedirectResult就被提前导航走了,也会出问题。另外,你可以试试把auth也加入useEffect的依赖数组,确保auth实例变化时能重新检查结果。还有个更稳妥的办法是结合onAuthStateChanged监听用户状态,这个方法能实时捕获用户登录状态,有时候比单独用getRedirectResult更可靠,比如:
useEffect(() => { // 用onAuthStateChanged监听用户状态 const unsubscribe = onAuthStateChanged(auth, (user) => { if (user) { console.log("已登录用户:", user); navigate("/"); } }); const checkRedirectResult = async () => { try { const result = await getRedirectResult(auth); console.log("Auth跳转结果:", result); } catch (error) { console.error("Auth错误:", error); toast.error("登录失败"); } }; checkRedirectResult(); // 组件卸载时取消监听 return unsubscribe; }, [navigate, auth]);
- Firebase SDK版本问题:有时候不同版本的Firebase Auth SDK会有一些小bug,你可以检查下自己的SDK版本,看看是不是最新版,或者有没有已知的相关问题。
还有个小细节,你在loginWithGoogle里调用signInWithRedirect后,不需要手动做导航,等Firebase跳转回来后,再由getRedirectResult或者onAuthStateChanged处理后续的页面跳转就好。
备注:内容来源于stack exchange,提问作者Vedant Shah

