You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 12:30:55