我在react-native-firebase(或firebase)方面遇到问题,其中在身份验证令牌刷新后我的应用程序未收到触发器。与[1]几乎相同,但是他们从未发布解决方案。
因此,发生的事情是,无论是在Android手机上还是在Android模拟器上(对iOS都一无所知),注册,登录和注销均能完美运行,这意味着听众可以正确地看到我执行{{1} }等。但是令牌刷新时,监听器从不触发。
我的第一个问题是:我是否正确假设logout()
侦听器应在60分钟后自动触发,而无需执行其他任何操作,例如调用任何firebase函数,以便该应用程序只坐在那里60分钟不执行任何操作,然后接收事件并替换令牌?
包含侦听器的主要组件如下:
onIdTokenChanged
通常,在侦听器内部,我有一个分派redux-action的函数,以便在我的组件之间广播身份验证信息。在这些组件内部,我将jwt令牌用于对后端的http请求。
现在,后端当然使用Firebase来验证令牌(这是自检索到过时的jwt以来60分钟后出现问题的地方),但是我认为我可以假设问题出在应用程序内部是正确的,因为刷新不会发生。
如果有人能指出我要去哪里看,我会感到非常高兴,我还尝试在Firebase控制台中查找是否发送了令牌刷新事件,但是我对此一无所获。
所以基本上:
1)我是否应该假设应该在不做任何其他事情的情况下调用class ReduxAppWrapper extends Component {
componentDidMount() {
firebase.auth().onAuthStateChanged((user) => {
console.log('COMP DID MOUNT: AUTH STATE CHANGED! ' + JSON.stringify(user));
});
firebase.auth().onIdTokenChanged((user) => {
console.log('COMP DID MOUNT: TOKEN CHANGED! ' + JSON.stringify(user));
});
firebase.auth().onUserChanged((user) => {
console.log('COMP DID MOUNT: USER CHANGED! ' + JSON.stringify(user));
});
};
render() {
return (
<ReduxProvider store={store}>
<MenuProvider>
<PaperProvider>
<AppContainer />
</PaperProvider>
</MenuProvider>
</ReduxProvider>);
}
}
函数?还是在主要组件中仅定义一次侦听器是不够的(还考虑到由于堆栈导航,其他屏幕将在其之上呈现的事实)。
2)如果代码正确,那么您有何提示?
非常感谢!
[1] https://github.com/invertase/react-native-firebase/issues/531
答案 0 :(得分:3)
对于遇到相同问题的任何人,我最终在每次需要它时都要向firebase索要令牌。我仍然认为这不是必须的,但我不想再花时间分析为什么刷新无法自动进行。所以我在应用程序中所做的是
firebase.auth().currentUser.getIdToken().then((token) => {
fetch(url, {
method: 'GET',
headers: { Authorization: token }
})
}
¯\ _(ツ)_ /¯
答案 1 :(得分:0)
显然,使用 getIdToken,Firebase 只会在当前令牌已过期时调用其服务器以获取新令牌;如果不需要,它不会创建不必要的请求。
这是一个非常重要的细节,如果您不知道它可能会令人困惑,并让您(正确地)假设 onIdTokenChanged 是一个侦听器,您需要使用它来自动更新令牌......
https://firebase.google.com/docs/reference/js/firebase.User.html#getidtoken
Returns the current token if it has not expired. Otherwise, this will refresh the token and return a new one.