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

React Native中MobX Store里Firebase+TypeScript无法获取accessToken?

解决方案:正确获取Firebase Auth的accessToken

我之前在React Native + MobX + Firebase的项目里也碰到过一模一样的问题!控制台能看到stsTokenManager.accessToken但代码里访问就报undefined,主要是因为Firebase的user对象是一个Proxy代理对象——控制台打印时会实时展开所有属性,但代码执行时某些内部属性可能还没完成初始化或代理,再加上MobX的Observable包装可能干扰属性访问。给你几个靠谱的解决办法:

1. 优先用回调传入的user参数,别依赖firebase.auth().currentUser

你现在的代码里在回调里又去获取currentUser,但其实回调函数已经把当前状态的用户对象传进来了,直接用这个参数更可靠——currentUser可能在状态切换的瞬间还没完成更新:

@action firebaseStatup = () => {
  firebase.initializeApp({ /* 你的配置 */ });
  firebase.auth().onAuthStateChanged((user) => {
    this.loggedIn = !!user;
    if (user) {
      this.user = user; // 直接使用回调提供的user参数
      console.log(user.stsTokenManager?.accessToken);
    }
  });
};

2. 用官方推荐的getIdToken()方法获取Token

Firebase提供了专门的异步方法来获取ID Token,比直接访问stsTokenManager更稳定,还能自动处理token过期刷新的问题,这也是官方最推荐的方式:

@action firebaseStatup = () => {
  firebase.initializeApp({ /* 你的配置 */ });
  firebase.auth().onAuthStateChanged(async (user) => {
    this.loggedIn = !!user;
    if (user) {
      this.user = user;
      // 异步获取有效JWT Token
      const accessToken = await user.getIdToken();
      console.log(accessToken);
    }
  });
};

3. 处理MobX Observable的对象包装问题

MobX的@observable会把对象包装成Observable实例,可能影响原生Firebase对象的属性访问。可以把user转为普通对象再赋值:

import { toJS } from "mobx";

// ...

@action firebaseStatup = () => {
  firebase.initializeApp({ /* 你的配置 */ });
  firebase.auth().onAuthStateChanged((user) => {
    this.loggedIn = !!user;
    if (user) {
      // 转为普通对象后再赋值给observable
      this.user = toJS(user) || user;
      console.log(this.user.stsTokenManager?.accessToken);
    }
  });
};

4. 用可选链操作符避免报错

不管哪种情况,加上可选链?.都能避免因属性不存在导致的报错,还可以配合空值合并运算符??设置默认值:

const token = this.user?.stsTokenManager?.accessToken ?? '';

总结一下,最推荐使用官方的getIdToken()方法,既稳定又能自动处理token刷新,比直接访问内部属性靠谱得多!

内容的提问来源于stack exchange,提问作者cbll

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:40:14