Firebase signInWithRedirect失效求助:getRedirectResult无输出
问题原因分析
signInWithRedirect的工作机制和signInWithPopup完全不同:调用signInWithRedirect后,浏览器会直接跳转到谷歌的授权页面,当前页面的JS执行上下文会被销毁,所以await signInWithRedirect之后的代码(包括Check 2、Check 3的打印)根本没有机会运行——这就是你看不到这些日志的核心原因。
而signInWithPopup是通过弹窗完成授权,当前页面的JS上下文不会中断,所以后续代码能正常执行。
解决方案
你需要把获取跳转结果的逻辑和触发跳转的逻辑分开:
- 触发跳转的函数只负责启动登录流程:
const signInWithGoogle = async () => { try { console.log("Check 1"); await signInWithRedirect(auth, googleAuthprovider); // 这里之后的代码不会执行,因为页面即将跳转 } catch (e) { console.log(e.message.slice(10)); } };
- 在页面初始化时(比如组件挂载、DOM加载完成后),单独调用
getRedirectResult来获取授权结果:
// 以React为例,用useEffect在组件挂载时检查 useEffect(() => { const fetchRedirectResult = async () => { try { const result = await getRedirectResult(auth); console.log("Check 3"); if (result) { console.log(result.user); } } catch (e) { console.log(e.message.slice(10)); } }; fetchRedirectResult(); }, []); // 如果是普通JS项目,放在DOMContentLoaded事件里 document.addEventListener('DOMContentLoaded', async () => { try { const result = await getRedirectResult(auth); console.log("Check 3"); if (result) { console.log(result.user); } } catch (e) { console.log(e.message.slice(10)); } });
额外注意事项
- 确保你在Firebase控制台和谷歌开发者平台都配置了正确的重定向URI,必须和你的应用域名完全匹配,否则授权后无法跳回应用,
getRedirectResult也拿不到结果。 - 如果用户在授权过程中取消登录,
getRedirectResult会返回null,记得处理这种情况。
内容的提问来源于stack exchange,提问作者Peter Malik
相关产品推荐
相关产品推荐

