如何以编程方式对受OpenId Connect保护的REST-API进行授权?



我已经实现了一个基于Spring Boot的REST-API,由Spring Security 5.2 OpenID Connect资源服务器保护。授权服务器是身份服务器4。到目前为止一切顺利,使用持有者令牌(令牌通过虚拟网页确定(的身份验证效果很好。

现在的挑战是从不需要用户交互的客户端(网页(调用 REST API。

我想为 API 用户提供一个不安全的端点(/授权(,可用于接收任何进一步安全服务的持有者令牌。用户名和密码应作为请求参数传递。

我已经搜索了网络并研究了 Spring 的文档,但我没有找到解决我的用例的东西。

我实现了一个相对简单的解决方案

@GetMapping
public ResponseEntity<GetTokenResponse> getToken(@RequestBody GetTokenRequest getTokenRequest) {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
MultiValueMap<String, String> formData = new LinkedMultiValueMap<>();
formData.add("client_id", clientId);
formData.add("client_secret", clientSecret);
formData.add("grant_type", "password");
formData.add("scope", scopes);
formData.add("username", getTokenRequest.getUsername());
formData.add("password", getTokenRequest.getPassword());
RestTemplate restTemplate = new RestTemplate();
HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(formData, headers);
ResponseEntity<GetTokenResponse> response = restTemplate.postForEntity( tokenEndPoint, request , GetTokenResponse.class );
String accessToken = response.getBody().getAccessToken();
NimbusJwtDecoder decoder = NimbusJwtDecoder.withJwkSetUri(jwkSetUri).build();
Jwt jwt = decoder.decode(accessToken);
logger.debug("Headers:n{}", jwt.getHeaders());
logger.debug("Claims:n{}", jwt.getClaims());
logger.info("User {}, {} '{}' authorised.", jwt.getClaimAsString("given_name"), jwt.getClaimAsString("family_name"), jwt.getClaimAsString("sub"));
return response;
}

响应包含持有者令牌,因此可用于 API 调用。