Как справиться с истечением срока действия токена firebase в Firebase 3.x.x

Я использовал " signInWithCustomToken()" для аутентификации пользователя firebase.

Этот токен истекает через 1 час.

Firebase порекомендовала выпустить токен до 1 часа. Если мы изменим истечение срока действия при создании пользовательского токена с использованием библиотеки "php-jwt", firebase выбрасывает исключение ". Пользовательский формат токена неверен. документация".

При поиске решений я обнаружил, "Ошибка аутентификации Firebase Android: expired_token (токен аутентификации истек)"

Но обновленный токен, возвращаемый " onTokenRefresh()", не работает для меня.

Какова будет процедура обновления этого пользовательского токена?

ИЛИ

Есть ли способ установить истечение вручную для пользовательского токена?

Ответ 1

Существует ограничение с генерацией пользовательских токенов Firebase. Пользовательский токен Firebase ограничен до 1 часа (3600 секунд).

exp Время в секундах, по истечении которого токен истекает. Это может быть максимум на 3600 секунд позже, чем iat.

Если токен аутентификации истекает каждый час, нам трудно постоянно поддерживать действующий сеанс :(

Когда мы используем провайдеров аутентификации по умолчанию, таких как (Google, Facebook, Email..); Firebase SDK по умолчанию позаботится об обновлении вашего токена авторизации. Но в пользовательской аутентификации Firebase SDK необходимо связаться со сторонним сервером для получения нового токена. Здесь только SDK не может обновить токен!

Мой обходной путь заключается в том, чтобы при каждом успешном извлечении токена сохранять информацию о "последнем получении токена" локально, чтобы мы могли обновить токен вручную через один час.

Вы можете обратиться к этой проблеме журнала для получения дополнительной информации,

  1. https://github.com/firebase/quickstart-android/issues/31
  2. В API Firebase 9.0.0 как проверить, есть ли у пользователя действительный сеанс аутентификации или нет?

Обновить:

Google обновил свой документ,

exp (время истечения): время в секундах с начала эпохи UNIX, по истечении которого токен истекает. Это может быть максимум 3600 секунд позже, чем IAT. (Примечание: это контролирует только время, когда истекает сам пользовательский токен. Но как только вы войдете в систему с помощью signInWithCustomToken(), они останутся вошедшими в устройство, пока их сеанс не будет признан недействительным или пока пользователь не выйдет.)

Как сказано в документе, пользовательский токен JWT действителен в течение максимум 1 часа; поэтому, прежде чем он истечет, аутентифицируйте своего пользователя с помощью Firebase. После этого сеанс останется активным; Это не истекает!

Вы можете использовать метод ниже, чтобы убедиться, что пользователь имеет действительный сеанс,

public static boolean hasValidAuthToken() {
    return FirebaseAuth.getInstance().getCurrentUser() != null ? true : false;
}

Надеюсь, это поможет вам!

Ответ 2

SDK позаботится о поддержании токенов в актуальном состоянии, если вы правильно настроите их. Для получения дополнительной информации Пользовательские токены используются только для запуска СЕССИИ. Таким образом, вы должны иметь час, чтобы использовать пользовательский токен для входа. После того как вы вошли в систему и правильно настроили свою учетную запись администратора Firebase и конфигурацию приложения, SDK может обмениваться данными с внутренним интерфейсом Firebase, чтобы поддерживать токены в актуальном состоянии. После того, как вы выйдете с помощью FirebaseAuth.signout(), вам потребуется новый пользовательский токен для входа, если он прошел более 1 часа.

Ответ 3

Примерно так можно проверить токен и посмотреть, не истек ли он. Затем вы можете чеканить новый

public async Task<string> GetIdTokenAsync()
{
  // Get current time in seconds from Epoch
  var secondsSinceEpoch = DateTimeOffset.UtcNow.ToUnixTimeSeconds();

  // We have already minted a token for this session, so check if we need a new one 
  if (this.idToken != null)
  {
    // Check to see if current token is expired or will expire soon
    var idTokenExpiration = JwtDecoder.TokenExpirationTime(this.idToken);
    if (idTokenExpiration > (secondsSinceEpoch - 60L))
    {
      return this.idToken;
    }
  }

  // No id token for this session, or we have an id token, but its expired, so mint a new one
  this.idToken = await auth?.CurrentUser?.GetIdTokenAsync(true);
  return this.idToken;
}

Ответ 4

Вы можете получить обновленный токен, используя этот код

FirebaseInstanceId.getInstance().getToken();

FirebaseInstanceId - это имя моего класса, которое оно соответствует вам.