Есть ли способ обновить токен с помощью таймера с помощью модификации?

Я пытаюсь получить данные из API, используя модификацию. Запрос, который я собираюсь использовать, требует токена доступа для передачи в заголовке. Проблема в том, что срок действия токена истекает через 10 минут, а для запроса токена обновления требуется токен с неистекшим сроком действия для создания нового! Итак, что мне делать, чтобы токен обновлялся сам по себе, прежде чем пройдет 10 минут? Я уже пробовал Interceptor, но он не может работать с проблемой такого типа, потому что мне нужен действительный токен, чтобы получить новый.

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

Mahmoud Omara 09.12.2020 17:44
1
1
614
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать Worker и настроить его на запуск каждые 30 минут или около того, а также настроить его на сохранение обновленного токена в вашем SharedPreference

вот пример для Worker

class UpdateTokenWorkManger(
val context: Context,
params: WorkerParameters) : Worker(context, params) {

override fun doWork(): Result {

    LoginHandler.refreshTokenSilently()

    // Indicate whether the work finished successfully with the Result
    return Result.success()
}

companion object {
    private const val TAG = "Token Refresh "
    const val TOKEN_REFRESH_WORK_MANGER_ID = "automatic_renew_token_work_manger"
    fun renewToken() {
        val periodicRefreshRequest = PeriodicWorkRequest.Builder(
            UpdateTokenWorkManger::class.java, // Your worker class
            30, // repeating interval
            TimeUnit.MINUTES
        )

        val periodicWorkRequest: PeriodicWorkRequest = periodicRefreshRequest
            .build()
        WorkManager.getInstance(App.getApplication()).enqueueUniquePeriodicWork(
            TOKEN_REFRESH_WORK_MANGER_ID,
            ExistingPeriodicWorkPolicy.REPLACE,
            periodicWorkRequest
        )
    }
}

для использования этого компонента вам понадобятся эти зависимости

implementation "androidx.work:work-runtime-ktx:2.4.0"

также обратите внимание, что LoginHandler — это класс, который должен отвечать за обработку ваших сценариев входа, обновления и выхода из системы.

и не забудьте добавить эту строку в свой первый Activity после входа в систему Activity, например: если вы входите в SplashActivity и после успешной авторизации перенаправляетесь на MainActivity, то эта строка должна быть в функции MainActivity'sonCreate

UpdateTokenWorkManger.renewToken()

Я попробовал этот код, но я не знаю, почему в журнале функция doWork работает только один раз. и я хочу спросить вас о App.getApplication(), это нормально, если я передам контекст в функцию renewToken в качестве альтернативы? и спасибо за ответ я очень ценю это

Montassar Selmi 09.12.2020 22:24

о, проблема в том, что я тестировал его в течение 1 минуты w Result.success() каждый раз, поэтому workmanager не повторяет работу

Montassar Selmi 09.12.2020 22:40

вы можете установить его на любой временной интервал, который вы хотите, но минимум составляет 15 минут, поэтому вам нужно ввести 15 по крайней мере для тестирования.

Mahmoud Omara 10.12.2020 17:13

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

Mahmoud Omara 10.12.2020 17:14

да, но токен обновляется каждые 10 минут, мне нужно обновить его, прежде чем это проблема, с которой я столкнулся, я думаю, может быть, alarmManager лучше для моей проблемы, не так ли?

Montassar Selmi 10.12.2020 17:17

очень странно видеть токен, который нуждается в обновлении каждые 10 минут, я думаю, что стандарт - это 30 минут-1 час, но для этого, возможно, лучше использовать второй подход перехватчика, который повторяет попытки.

Mahmoud Omara 10.12.2020 17:20

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

Montassar Selmi 10.12.2020 17:27

какой сервис вы используете для аутентификации?

Mahmoud Omara 10.12.2020 17:34

на самом деле я использую сервис компании на локальном хосте

Montassar Selmi 10.12.2020 17:39

если нет риска для безопасности с обновлением каждые 15-30 минут, тогда я думаю, вам следует запросить это редактирование у вашей внутренней команды.

Mahmoud Omara 10.12.2020 17:48

Другие вопросы по теме