1 분 소요

Spring REST Docs 작업을 진행 중 Spring Security의 Acess Token에 대한 API 명세를 작성 중 겪은 이슈

POST [baseURL]/token에서 처리하는 API

  • Authorization Code Grant
  • Client Credentials Grant
  • Resource Owner Password Credentials Grant

각각의 방식에는 각각의 입력 파라미터가 존재한다.

3가지 방식에 대해서 아래와 같이 Controllerd의 3가지 메서드를 만들었다.

@RestController
public class AuthorizationController {

  @PostMapping(value="/token", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
  public void authorize(@RequestBody AuthReq authReq) {
    //
  }

  @PostMapping(value="/token", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
  public void clientAuthorize(@RequestBody ClientAuthReq clientAuthReq) {
    //
  }

  @PostMapping(value="/token", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
  public void authorize(@RequestBody PwdAuthReq pwdAuthReq) {
    //
  }
}

각 메서드에 대한 Test Case를 실행했을 때, 아래와 같은 오류가 발생하였다.

java.lang.IllegalStateException: Ambiguous mapping found. Cannot map ‘AuthorizationController ’ bean method

DispatcherServlet이 요청으로 들어온 URL을 보고 Controller의 메서드를 실행하는데, 동일한 URL이 있어 구분할 수 없어서 발생시킨 오류이다.

Spring Security에서는 분명히 /token에서 각각의 방식을 모두 처리하고 있는데, 어떻게 처리해야할까???

spring-security-oauth2 라이브러리의 TokenEndpoint.class를 참고하였다.

...
@RequestMapping(value = "/oauth/token", method=RequestMethod.POST)
public ResponseEntity<OAuth2AccessToken> postAccessToken(Principal principal, @RequestParam
	Map<String, String> parameters) throws HttpRequestMethodNotSupportedException {
        //
}
...

위 코드에서 /token에서 @RequestParam Map으로 여러 값을 받은 후 Map에 있는 값을 통해 분기하여 각각을 처리하고 있었다.

이를 통해 위 문제를 해결하였다.

@PostMapping(value = "/token", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
public ResponseEntity<byte[]> token(@RequestParam Map<String, String> parameters) throws IOException {
            // 분기 로직

            }

카테고리:

업데이트:

댓글남기기