React-Native Firebase:令牌刷新不起作用

时间:2019-05-03 07:13:41

标签: android firebase react-native react-native-firebase

我在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

2 个答案:

答案 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.