Обновление токена доступа - лучшие практики - PullRequest
0 голосов
/ 19 апреля 2019

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

public Store getVendor(String url,boolean tokenreseted) throws Exception {

    Store store =null;
    try {
        store = (Store) RestClient.get(url, headers, queryparam, Store.class);
    } 
    catch (UnauthorizedException e) { 
        if(!tokenreseted) {  //Try with new Access token. 
            accessToken=getAccessToken();
            return getVendor(url,true);
        }
        else
            throw new Exception("UnauthorizedException exception", e);
    }
    catch (Exception e) {
        throw new Exception("Error occured while getting storeIds",e);
    }

    return store;
}

Над кодом работает .. Но разве это хорошая практика? или есть другой лучший способ сделать?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 22 апреля 2019

используйте org.springframework.security.oauth2.client.OAuth2RestTemplate... https://docs.spring.io/spring-security/oauth/apidocs/org/springframework/security/oauth2/client/OAuth2RestTemplate.html

Ниже приведен код, который можно использовать:

@Bean
public OAuth2RestTemplate rteClient(OAuth2ClientContext oauth2ClientContext) throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException, CertificateException, IOException {

    OAuth2RestTemplate rteClient = new OAuth2RestTemplate(rte(), oauth2ClientContext);
    rteClient.setAccessTokenProvider(buildAccessTokenProvider());   
    return rteClient;
}

private OAuth2ProtectedResourceDetails rte() {
    ClientCredentialsResourceDetails rte = new ClientCredentialsResourceDetails();
    rte.setGrantType("client_credentials");
    rte.setAuthenticationScheme(AuthenticationScheme.header);
    rte.setClientId("clientId");
    rte.setClientSecret("clientSecret");
    rte.setAccessTokenUri("http://..");
    return rte;
}

private ClientCredentialsAccessTokenProvider buildAccessTokenProvider() throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException, CertificateException, IOException { 
    ClientCredentialsAccessTokenProvider accessTokenProvider = new ClientCredentialsAccessTokenProvider();
    return accessTokenProvider;
}

Автоматическое связывание вышеуказанного компонента для вызова API с токеном.перед звонком он позаботится об истечении срока действия.

0 голосов
/ 22 апреля 2019

Я бы порекомендовал использовать expiryTime, поскольку вы знаете, что ваш токен доступа истечет через час. Попробуйте следующее.

  1. Получить токен доступа. Хранить в Object с токеном и expiryTime.
  2. Генерировать запрос только тогда, когда currentTime + 30 секунд <= <code>expiryTime. 30 секунд - небольшой порог для создания нового токена доступа.
  3. Если нет, создайте новый токен и обновите Object новым токеном и expiryTime и вызовите API.
...