React-Native Firebase:令牌刷新不起作用
React-Native Firebase: Token refresh not working
我在使用 react-native-firebase(或 firebase)时遇到问题,我的应用程序在身份验证令牌刷新后没有收到触发器。这与 [1] 的问题几乎相同,但他们从未发布解决方案。
所以,发生的事情是在 Android phone 和 Android 模拟器上(不知道 iOS),注册,登录和注销完美无缺,这意味着当我执行 logout()
等操作时,听众可以正确看到。但是当令牌刷新时,听众 永远不会 触发。
我的第一个问题是:我假设 onIdTokenChanged
-listener 应该在 60 分钟后自动触发而无需做任何其他事情,例如调用任何 firebase 函数,这样应用就可以静置 60 分钟,然后接收事件并替换令牌?
包含侦听器的主要组件如下所示:
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>);
}
}
通常在侦听器内部,我有一个函数可以调度 redux-action,以便在我的组件中广播身份验证信息。在这些组件中,我使用 jwt 令牌向我的后端发送 http 请求。
现在后端当然使用 firebase 来验证该令牌(这就是它检索过时的 jwt 后 60 分钟后出现问题的地方),但我认为我认为问题出在应用程序,因为刷新不会发生。
如果有人能指出我在哪里查看,我会非常高兴,我还试图在 firebase 控制台中找出是否发送了令牌刷新事件,但我找不到任何相关信息。
所以基本上:
1) 我认为 firebase.auth().onIdTokenChanged()
函数应该在我不做任何其他事情的情况下被调用是正确的吗?或者在主要组件中定义一次监听器是否不够(也考虑到由于堆栈导航,其他屏幕将在其上呈现的事实)。
2) 如果代码没问题,你有什么地方可以看的提示吗?
非常感谢!
[1] https://github.com/invertase/react-native-firebase/issues/531
对于遇到相同问题的任何人,我最终都会在每次需要令牌时询问 firebase 以获取令牌。我仍然认为这不是必需的,但我不想再花时间分析为什么刷新没有自动工作。所以我在应用程序中做的是
firebase.auth().currentUser.getIdToken().then((token) => {
fetch(url, {
method: 'GET',
headers: { Authorization: token }
})
}
¯\_(ツ)_/¯
显然,对于 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.
我在使用 react-native-firebase(或 firebase)时遇到问题,我的应用程序在身份验证令牌刷新后没有收到触发器。这与 [1] 的问题几乎相同,但他们从未发布解决方案。
所以,发生的事情是在 Android phone 和 Android 模拟器上(不知道 iOS),注册,登录和注销完美无缺,这意味着当我执行 logout()
等操作时,听众可以正确看到。但是当令牌刷新时,听众 永远不会 触发。
我的第一个问题是:我假设 onIdTokenChanged
-listener 应该在 60 分钟后自动触发而无需做任何其他事情,例如调用任何 firebase 函数,这样应用就可以静置 60 分钟,然后接收事件并替换令牌?
包含侦听器的主要组件如下所示:
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>);
}
}
通常在侦听器内部,我有一个函数可以调度 redux-action,以便在我的组件中广播身份验证信息。在这些组件中,我使用 jwt 令牌向我的后端发送 http 请求。
现在后端当然使用 firebase 来验证该令牌(这就是它检索过时的 jwt 后 60 分钟后出现问题的地方),但我认为我认为问题出在应用程序,因为刷新不会发生。
如果有人能指出我在哪里查看,我会非常高兴,我还试图在 firebase 控制台中找出是否发送了令牌刷新事件,但我找不到任何相关信息。
所以基本上:
1) 我认为 firebase.auth().onIdTokenChanged()
函数应该在我不做任何其他事情的情况下被调用是正确的吗?或者在主要组件中定义一次监听器是否不够(也考虑到由于堆栈导航,其他屏幕将在其上呈现的事实)。
2) 如果代码没问题,你有什么地方可以看的提示吗?
非常感谢!
[1] https://github.com/invertase/react-native-firebase/issues/531
对于遇到相同问题的任何人,我最终都会在每次需要令牌时询问 firebase 以获取令牌。我仍然认为这不是必需的,但我不想再花时间分析为什么刷新没有自动工作。所以我在应用程序中做的是
firebase.auth().currentUser.getIdToken().then((token) => {
fetch(url, {
method: 'GET',
headers: { Authorization: token }
})
}
¯\_(ツ)_/¯
显然,对于 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.