前提
KeycloakへSpring Rest Template を使ってどうこうする例。
Postして、結果JSONをObjectに詰めたい。
RestTemplate Bean定義
@Bean
public RestTemplate restTemplate() {
var restTemplate = new RestTemplate();
HttpMessageConverter<?> formHttpMessageConverter = new FormHttpMessageConverter();
restTemplate.getMessageConverters().add(formHttpMessageConverter);
restTemplate.getMessageConverters().add(getMappingJackson2HttpMessageConverter());
return restTemplate;
}
public MappingJackson2HttpMessageConverter getMappingJackson2HttpMessageConverter() {
MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
mappingJackson2HttpMessageConverter.setSupportedMediaTypes(Collections.singletonList(MediaType.APPLICATION_JSON));
return mappingJackson2HttpMessageConverter;
}
FormHttpMessageConverter
Content-Type
:application/x-www-form-urlencoded
の対応。
MappingJackson2HttpMessageConverter
Content-Type
:application/json
の対応。
受け取り用DTO
TokenResponseDto.java
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.*;
@ToString
@EqualsAndHashCode
@NoArgsConstructor
@AllArgsConstructor
public class TokenResponseDto {
@Getter
@JsonProperty("access_token")
private String accessToken;
@Getter
@JsonProperty("expires_in")
private Integer expiresIn;
@Getter
@JsonProperty("refresh_expires_in")
private Integer refreshExpiresIn;
@Getter
@JsonProperty("refresh_token")
private String refreshToken;
@Getter
@JsonProperty("token_type")
private String tokenType;
@Getter
@JsonProperty("not-before-policy")
private Integer notBeforePolicy;
@Getter
@JsonProperty("session_state")
private String sessionState;
@Getter
@JsonProperty("scope")
private String scope;
}
@Value
をつけたかったが、Jacksonが動かなそうだったので、@Getter
で。
呼び出し
URI uri = new DefaultUriBuilderFactory().builder()
.scheme("http")
.host("192.168.1.31")
.port(8083)
.path("auth/realms/Test/protocol/openid-connect/token")
.build();
MultiValueMap<String,String> request = new LinkedMultiValueMap<>(){{
add("grant_type", "authorization_code");
add("code", code);
add("redirect_uri", "http://localhost:7000/login");
add("client_id", "test");
}};
RequestEntity<MultiValueMap<String, String>> requestEntity = RequestEntity.post(uri)
.contentType(MediaType.APPLICATION_FORM_URLENCODED)
.accept(MediaType.APPLICATION_JSON)
.body(request);
ResponseEntity<TokenResponseDto> ret = restTemplate.postForEntity(uri, requestEntity, TokenResponseDto.class);
ポイント
FormHttpMessageConverter
は、MultiValueMap
インタフェースベース。Map
じゃだめ。