我正在开发一个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,这是完全错误的!!!我的问题是,如何自动在应用程序中接收和存储已发行的令牌,并在令牌到期之前使用它,然后自动获得新的令牌? 另一方面,我的令牌仅包含访问令牌,不包含刷新令牌(我不知道为什么!!!这太奇怪了!!)
答案 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将使用和升级令牌