Обновление Oauth2 обновляет токены в Android

Я разрабатываю приложение для Android, которое использует маркеры Oauth2, чтобы получить авторизацию для доступа к защищенным ресурсам. Я использую стороннюю платформу в качестве сервера аутентификации (используя OpenId Connect). В основном моя проблема заключается в том, что я хочу иметь дело с токеном обновленного обновления.

Текущий сценарий

У меня есть класс NetUtils который действует как синглтон и управляет всеми моими запросами, используя защищенный шаблон для отдыха. Этот шаблон отдыха вводит требуемый заголовок авторизации для каждого запроса с использованием оболочки запроса. Класс 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 в настоящее время жестко закодированы в приложении (хотя клиентские учетные данные не предназначены для активации на производстве, поэтому по-прежнему необходимо указать имя пользователя и пароль для получения токена).

Какая была бы лучшая практика здесь?

+1
источник поделиться
1 ответ

Я думаю, что я не могу предложить вам, как закодировать на Java, но у меня также возникли проблемы с refresh_token при создании приложения на PHP, поэтому, возможно, мои мысли помогут вам в чем-то.

Сначала я искал refresh_token, который никогда не истекает (как в Google API), поэтому я могу даже жестко кодировать его и использовать каждый раз, когда хочу создать новый access_token. Во всяком случае, это очень трудно сделать в oAuth2. Поэтому я нашел интересный взгляд на эту проблему здесь:

Почему заканчиваются токены доступа?

Это показало мне немного другой способ работы с refresh_token. Я установил в своей службе oAuth, что он генерирует и возвращает новый refresh_token каждый раз, когда я использую refresh_token для получения нового access_token. Эта часть помогла мне больше всего:

https://bshaffer.github.io/oauth2-server-php-docs/grant-types/refresh-token/

И там у нас есть что-то вроде:

$server = new OAuth2\Server($storage, array(
    'always_issue_new_refresh_token' => true, // this part
    'refresh_token_lifetime'         => 2419200,
));

В этом случае у меня есть длинный live refresh_token, который я могу хранить где-то, и когда мне это нужно, я буду использовать его для получения нового access_token, но ответ также предоставит мне новый refresh_token, который я могу снова сохранить и использовать позже для получения новый access_token.

Поэтому в вашем случае я считаю, что лучший способ - генерировать refresh_token каждый раз, когда вы запрашиваете access_token с refresh_token. И если пользователь больше не будет использовать ваш APP, я думаю, он должен снова авторизоваться.

+1
источник

Посмотрите другие вопросы по меткам или Задайте вопрос