Я разрабатываю приложение для Android, которое использует маркеры Oauth2, чтобы получить авторизацию, чтобы получить доступ к защищенным ресурсам. Я использую стороннюю платформу в качестве сервера аутентификации (используя OpenId Connect). В основном моя проблема заключается в том, что я хочу иметь дело с токеном обновленного обновления.Oauth2 обновить токен обновления в Android
Текущего сценарий
У меня NetUtils
класса, который действует как синглтон и управляет всеми моими запросами с помощью защищенного шаблона отдыха. Этот шаблон отдыха вводит требуемый заголовок авторизации для каждого запроса с использованием оболочки запроса. Класс NetUtils
имеет дело с токенами и таймаутами, сохраняя их в пользовательских настройках и обновляя их, когда это необходимо.
Однако проблема возникает, когда истекает токен обновления. Поскольку я использую поток кода авторизации, мне нужно открыть WebView и перенаправить пользователя на страницу входа в систему, но я замечаю это, когда класс NetUtils определяет токен обновления, истек. В идеале, приложение запустило бы WebView, пользователь снова войдет в систему, и сохраненный запрос будет выполнен. Вот это мой код, чтобы обновить маркер доступа:
private AccessToken refreshToken(String idClient, String clientSecret, AccessToken accessToken) {
MultiValueMap<String, String> clientAuthenticationForm = new LinkedMultiValueMap<>();
clientAuthenticationForm.add("grant_type", "refresh_token");
clientAuthenticationForm.add("refresh_token", accessToken.getRefreshToken());
clientAuthenticationForm.add("client_id", idClient);
clientAuthenticationForm.add("client_secret", clientSecret);
try {
long lastClientRefresh = mPrefs.getLong(Preferences.LAST_LOGIN_TIME, Long.MIN_VALUE);
boolean refreshTokenExpired = lastClientRefresh
+ TimeUnit.SECONDS.toMillis(accessToken.getRefreshExpiresIn()) < System
.currentTimeMillis();
if (!refreshTokenExpired) {
return regularRestTemplate
.postForEntity(tokenUrl(), clientAuthenticationForm, AccessToken.class)
.getBody();
}else{
//How to cope with this?
return null;
}
} catch (Exception ex) {
Log.e(TAG, ex.getMessage(), ex);
throw ex;
}
}
Другой выбор
Другой выбор должен был бы сделать обновление лексема долгоживущих и обновить его каждый раз при запуске приложения, например. Я должен упомянуть, что client_id и client_secret в настоящее время жестко закодированы в приложении (хотя клиентские учетные данные не предназначены для включения в производство, поэтому по-прежнему необходимо указать имя пользователя и пароль для получения токена).
Что было бы лучше всего здесь?
Спасибо за ваш ответ! Это более или менее то, что я реализовал в конце –