2016-11-15 2 views
1

Я разрабатываю приложение для 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 в настоящее время жестко закодированы в приложении (хотя клиентские учетные данные не предназначены для включения в производство, поэтому по-прежнему необходимо указать имя пользователя и пароль для получения токена).

Что было бы лучше всего здесь?

ответ

1

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

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

Why do access tokens expire?

Он показал мне немного другой способ работы с 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, 
)); 

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

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

+0

Спасибо за ваш ответ! Это более или менее то, что я реализовал в конце –

Смежные вопросы