Токен идентификатора Firebase ID истекает через час

#javascript #react-native #firebase-authentication #redux-saga #auth-token

# #javascript #react-native #firebase-аутентификация #redux-сага #auth-токен

Вопрос:

итак, я использую redux-saga в своем приложении react-native и попытался использовать токен обновления, но не сработал, поэтому мой подход был следующим в app.js для того, чтобы получить токен специально для каждого запроса и принудительно обновить его:

   handleResponse = async () => {
    const {dispatch} = this.store;
    await axios.interceptors.request.use(config => {
      // Important: request interceptors **must** return the request.
      console.log("refreshToken")
      let user =  firebase.auth().currentUser;
        firebase.auth().onAuthStateChanged(function(user) {   if (user) {
          console.log("auth changed: ",user)
          user.getIdToken(true).then((token) => {
                setAccessToken(token);
                config.headers.authorization = token;
              }
          );
        } else { console.log("didn't auth change") } });
      console.log("req in handle response: ",JSON.stringify(config));
      return config;
    });
    axios.interceptors.response.use(config => config, (err) => {
      if (err.response) {
        const response = err.response;
        const state = this.store.getState();
        if (
            response.status === 401
            amp;amp; state.auth.isAuthenticated
        ) {
          dispatch(logout());
        }
      }
      return Promise.reject(err);
    });
  };
 

Но это всегда заканчивается через час, выдавая мне следующую ошибку::

Токен идентификатора Firebase ID истек. Получите новый токен из своего клиентского приложения и повторите попытку (auth / id-token-expired). Смотрите https://firebase.google.com/docs/auth/admin/verify-id-tokens для получения подробной информации о том, как получить идентификационный токен.

итак, мне было интересно, есть ли другой подход, который я могу попытаться решить проблему со своей стороны?

Заранее спасибо.

Ответ №1:

Токены аутентификации Firebase автоматически обновляются каждый час. Это функция SDK, и вам не нужно ничего делать, чтобы включить ее.

Вы определенно не хотите вызывать firebase.auth().onAuthStateChanged для каждого запроса. Это запускает постоянный прослушиватель и добавляет новый обратный вызов каждый раз, когда он используется. Обычно вы добавляете только одного слушателя глобально для своего приложения и используете его обновления по мере их появления.

Если вам нужно знать, когда SDK обновляет токен, чтобы немедленно получить новый, вам следует вместо этого использовать onIdTokenChanged для настройки обратного вызова, который будет вызываться каждый раз при изменении токена пользователя. Опять же, вы должны настроить только один из них глобально для своего приложения и использовать его текущее значение во время запроса.

Комментарии:

1. Большое спасибо за ваш подробный ответ! это полностью сработало и помогло мне лучше понять проблему 🙂