将访问令牌存储在OAuth2.0应用程序中,并重复使用直到它到期?

时间:2018-06-27 07:32:08

标签: java rest spring-boot oauth-2.0 spring-security-oauth2

我正在开发一个OAuth2.0“ CLIENT”应用程序,该应用程序调用一些API(受oauth2.0保护)。 我正在使用OAuth2.0RestTemplate,其中包含CLIENT_ID,CLIENT_SECRET,用户名和密码。调用OAuth2.0安全API的代码如下:

@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());

如您所见,每次我想调用服务时,代码都会获得一个新的ACCESS TOKEN,这是完全错误的!!!我的问题是,如何自动在应用程序中接收和存储已发行的令牌,并在令牌到期之前使用它,然后自动获得新的令牌? 另一方面,我的令牌仅包含访问令牌,不包含刷新令牌(我不知道为什么!!!这太奇怪了!!)

2 个答案:

答案 0 :(得分:0)

您好,您可以设计类似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");
            }

答案 1 :(得分:0)

首先,您必须在Spring引导中为此定义您的应用程序为Oaut2App,您可以在代码中使用注释@ EnableOAuth2Client并在applicaition.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

通过这种方式,您可以确保spring的OAuth2RestTemplate将使用和升级令牌