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
相关产品推荐
相关产品推荐

