Когда обновить идентификатор токена firebase

# #reactjs #rest #session #firebase-authentication

Вопрос:

Я разрабатываю веб-приложение, используя React для интерфейса и Django для бэкенда. Пользовательский интерфейс полностью обрабатывается React и использует API-интерфейс Django REST.

Я выбрал firebase в качестве поставщика аутентификации и реализовал его следующим образом:

  • сервер (Django) подключается к firebase и предоставляет конечные точки аутентификации для реагирования.
    • например, Django’s /api/login отправляет запрос POST в Firebase Auth REST API и пересылает ответ (или его части) на интерфейс
  • разрешение основано на JWT tokenID , предоставленном firebase

Все работает, как ожидалось , но срок действия firebase tokenID истекает через один час, и его необходимо обновить с помощью refreshToken действия, для которого требуется POST запрос на серверы firebase. Я сохраняю оба этих токена на интерфейсе, но я не могу придумать способ убедиться, что tokenID они действительны перед каждым запросом на сервер. Я также сохраняю время unix, когда токен будет отозван.

Поскольку мне не нужен код firebase на стороне клиента, я вижу несколько вариантов:

  1. используйте setTimeout() . При входе в систему установите таймер на один час, а при перезагрузке страницы установите его на разницу между временем истечения срока действия токена и new Date() .
    • было бы это неэффективно? чтобы иметь ожидающий таймер в фоновом режиме?
  2. проверяйте и обновляйте, если это необходимо, перед каждым вызовом api.
     async function fetchSomething(tokenID: string) {
       tokenID = await refreshIfNecessary(tokenID);
       fetch("api/endpoint", {
           method: "POST",
           headers: {
              Authorization: tokenID
           }
       }.then(r => {...})
    }
     
    • Но это был бы какой-то уродливый код, который мне нужно было бы повторять tokenID = await refreshIfNecessary(tokenID); в каждой функции api
  3. не пытайтесь обновить токен на интерфейсе, но когда API получит идентификатор токена с истекшим сроком действия, обновите его и отправьте запрошенные данные с новым токеном
    • это добавляет много сложностей как в пользовательском интерфейсе, так и на сервере