【问题标题】:React-Native Firebase: Token refresh not workingReact-Native Firebase:令牌刷新不起作用
【发布时间】:2019-05-03 07:13:40
【问题描述】:

我的 react-native-firebase(或 firebase)存在问题,我的应用在身份验证令牌刷新后未收到触发器。这与 [1] 的问题几乎相同,但他们从未发布过解决方案。

所以,在 Android 手机和 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

【问题讨论】:

  • 我也遇到了同样的问题,你能解决这个问题吗?
  • 嗨@JamesGallagher,请看下面我的回答

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


【解决方案1】:

对于遇到相同问题的任何人,我最终都会在每次需要令牌时询问 firebase 询问令牌。我仍然认为这不应该是必要的,但我不想再花时间分析为什么刷新没有自动工作。所以我在应用程序中所做的是

firebase.auth().currentUser.getIdToken().then((token) => {
  fetch(url, {
    method: 'GET',
    headers: { Authorization: token }
  })
}

¯\_(ツ)_/¯

【讨论】:

  • 感谢您分享您的解决方案,我现在也这样做了。 Firebase 文档既痛苦又令人困惑
【解决方案2】:

显然,使用 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.

【讨论】:

    猜你喜欢
    • 2021-09-04
    • 2017-06-30
    • 2019-12-08
    • 2018-01-20
    • 2020-01-22
    • 2017-07-18
    • 2021-08-24
    • 2016-10-16
    • 2016-11-21
    相关资源
    最近更新 更多