iOS端Google登录后onAuthStateChanged与getRedirectResult返回null用户
iOS端Google登录随机失效问题:约1/10用户重定向后
user为null且无错误日志 问题现象
- iOS端使用Google作为登录提供商时,约10%的用户会随机遇到登录流程失效的情况;Facebook登录可能存在类似问题,暂未确认
- 用户选择Google账户后,页面重定向回应用,
onAuthStateChange触发但返回的user为null,无任何错误日志,整个过程就像页面刷新而非正常重定向 - 受影响的用户在桌面端使用同一应用包可以正常完成登录
推测与个人情况
- 推测该问题可能与用户尝试使用多个认证提供商,导致认证状态异常有关
- 近期我自己的账号也出现了这个问题,回退到旧版本应用也无法解决,现在已经无法登录自家应用
相关代码(UserProvider.tsx)
firebaseConfig.apiKey = process.env.REACT_APP_AUTH_API_KEY; firebaseConfig.authDomain = process.env.REACT_APP_AUTH_DOMAIN; firebaseConfig.projectId = "redacted"; firebaseConfig.storageBucket = "redacted.appspot.com"; firebaseConfig.messagingSenderId = "redacted"; firebaseConfig.appId = "redacted"; // Initialize Firebase const app = initializeApp(firebaseConfig); // Initialize Firebase Authentication and get a reference to the service const auth = initializeAuth(app, { popupRedirectResolver: browserPopupRedirectResolver, persistence: [indexedDBLocalPersistence, browserLocalPersistence, inMemoryPersistence], errorMap: debugErrorMap }); const UserContextProvider = (props) => { const signInWithGoogle = () => { signInWithRedirect(auth, googleAuthProvider); } const handleUserCredential = async (result: UserCredential) => { if (result.user) { const additionalInfo = getAdditionalUserInfo(result) dispatch({ type: 'SET_ADDITIONAL_USER_INFO', data: { additionalInfo: additionalInfo, } }); } } useEffect(() => { dispatch({ type: 'LOGIN_INITIATED' }); const handleRedirectResult = async () => { alert("handling redirect result"); const result = await getRedirectResult(auth); alert(`redirect result: ${result}`); if (result) { handleUserCredential(result) } } onAuthStateChanged(auth, async (user: User | null) => { alert(`on auth change fired: ${user}`); if (user) { // set the token now const token = await getIdToken(user); const refreshToken = async () => { return await getIdToken(user, true); } onLoginSuccess(user, token, refreshToken); } else { onLogoutSuccess(); } }, (error) => { onError(error) }); handleRedirectResult(); }, [])
补充说明
- 由于
user为null,代码会触发onLogoutSuccess() - 代码中的
alert是为调试添加的临时代码,生产环境中不存在
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

