Сохранить токен доступа в приложении OAuth2.0 и использовать его повторно до истечения срока его действия? - PullRequest
0 голосов
/ 27 июня 2018

Я занимаюсь разработкой OAuth2.0 "CLIENT" приложения, которое вызывает некоторые API (защищено oauth2.0). Я использую OAuth2.0RestTemplate, который содержит CLIENT_ID, CLIENT_SECRET, имя пользователя и пароль. Код для вызова защищенных API OAuth2.0 выглядит следующим образом:

@Bean
    OAuth2ProtectedResourceDetails resource() {

        ResourceOwnerPasswordResourceDetails resource = new ResourceOwnerPasswordResourceDetails();
        List<String> Scopes = new ArrayList<String>(2);
        Scopes.add("read");
        Scopes.add("write");
        resource.setClientAuthenticationScheme(AuthenticationScheme.header);
        resource.setId("*****");
        resource.setAccessTokenUri(tokenUrl);
        resource.setClientId("*****");
        resource.setClientSecret("*****");
        resource.setGrantType("password");
        resource.setScope(Scopes);
        resource.setUsername("*****");
        resource.setPassword("*****");
        return resource;
    }



@Autowired
private OAuth2RestTemplate restTemplate;


Map<String, String> allCredentials = new HashMap<>();
allCredentials.put("username", "***");
allCredentials.put("password", "***");
        restTemplate.getOAuth2ClientContext().getAccessTokenRequest().setAll(allCredentials);
ParameterizedTypeReference<List<MyObject>> responseType = new ParameterizedTypeReference<List<MyObject>>() {        };
ResponseEntity<List<MyObject>> response = restTemplate.exchange("https://***.*****.com/api/*****/*****",
                HttpMethod.GET,
                null,
                responseType);
AllCities all = new AllCities();
all.setAllCities(response.getBody());

Как вы можете видеть каждый раз, когда я хочу позвонить в службу, код получает новый ЖЕЛЕЗНЫЙ ДОСТУП, который совершенно неверен !!! У меня вопрос: как я могу автоматически получать и сохранять выданный токен в своем приложении, использовать его до истечения срока его действия, а затем автоматически получать новый? С другой стороны, мой токен содержит только токен доступа и не содержит токена обновления (я не знаю почему !!! это так странно !!!)

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Прежде всего вы должны определить, что ваше приложение является Oaut2App, для этого при загрузке Spring вы можете использовать аннотацию @ EnableOAuth2Client в своем коде и настроить метаданные клиентского приложения в вашем applicationaition.yml. Скелетное клиентское приложение может быть как показано ниже:

@EnableOAuth2Client
@SpringBootApplication
public class HelloOauthServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(HelloOauthServiceApplication.class, args);
    }

    @Bean
    public OAuth2RestTemplate oAuth2RestTemplate(OAuth2ProtectedResourceDetails resource){
        return new OAuth2RestTemplate(resource);
    }
}

application.yml

security:
  oauth2:
    client:
     clientId: client
     clientSecret: secret
     accessTokenUri: http://localhost:9090/oauth/token
     userAuthorizationUri: http://localhost:9090/oauth/authorize
     auto-approve-scopes: '.*'
     registered-redirect-uri: http://localhost:9090/login
     clientAuthenticationScheme: form
     grant-type: passwordR
    resource:
     token-info-uri: http://localhost:9090/oauth/check_token

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

0 голосов
/ 28 июня 2018

Здравствуйте, вы можете создать как клиентскую библиотеку Google. Первый шаг - создание хранилища данных для хранения токена
в вашем каталоге, например C: /User/soyphea/.token/datastore.

.

Перед загрузкой вашей функции восстановите access_token_store. Ваш токен доступа должен иметь значение expired_in.

 if(access_token_store from your datastore !=null && !expired){
         access_token = access_token_store.
        } else {
          access_token = Your RestTemplate function for retrieve access_token.
 }

наконец вы можете получить access_token.

В весенней безопасности oauth2, если вы хотите поддержать refresh_token, вам нужно установить,

 @Override
            public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
                clients.inMemory()
                        .withClient("resource-serv")
                        .scopes("read")
                        .resourceIds("my-resource")
                        .secret("secret123")
                        .and()
                        .withClient("app")
                        .authorizedGrantTypes("client_credentials", "password", "refresh_token")
                        .scopes("read")
                        .resourceIds("my-resource")
                        .secret("appclientsecret");
            }
...