Retrofit - обрабатывает срок действия маркера обновления - PullRequest
1 голос
/ 15 апреля 2019

Когда истекает токен доступа моего приложения, я использую токен обновления, чтобы получить новый токен доступа через класс Authenticator.

Мой код следующий:

if (response.code() == 401) {
   Log.d("refresh", "Access token expired")
   val webservice: Webservice = RetrofitClient.makeRetrofitService().create(Webservice::class.java)
   var refreshToken = PreferenceData.getUserLoggedInRefreshToken(App.GetContext()!!)
   var map = generateRequestBody(mapOf("refreshToken" to refreshToken!!))
   var refreshResponse = webservice.refreshToken(map).execute()

   if (refreshResponse != null && refreshResponse.code() == 200) {
      Log.d("refresh", "New access token received")
      var newToken = (refreshResponse.body() as UserLogin).token
      var refreshToken = (refreshResponse.body() as UserLogin).refreshToken
      PreferenceData.setUserLoggedInAccessToken(App.GetContext()!!, newToken)
      PreferenceData.setUserLoggedInRefreshToken(App.GetContext()!!, refreshToken)

      return response.request().newBuilder()
      .header("Authorization", "Bearer $newToken")
      .build();
    }
}

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

var refreshResponse = webservice.refreshToken(map).execute()

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

спасибо!

1 Ответ

2 голосов
/ 15 апреля 2019

Вы можете взглянуть на AppAuth-Android реализацию.

  1. Перед выполнением любого вызова вы можете проверить, что у вас еще есть действительный токен доступа , узнать время его истечения и сравнить его с результатом clock.getCurrentTimeMillis().

  2. В случае, если токен доступа недействителен по другим причинам (например, токен доступа может быть аннулирован вручную), вы можете использовать Okhttp Interceptor для реагирования на 401 с.

  3. Если срок действия токена истек или вы получаете 401, вы можете попробовать обновить токен доступа с помощью вашего токена обновления .

  4. Если токен обновления больше не действителен, конечная точка /token вернет следующую ошибку :

HTTP / 1.1 400 Bad Request {"error": "invalid_request"}

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

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

...