티스토리 뷰
Swagger를 잘 사용하다가 추후 JWT 인증 방식을 적용하면 Token 정보가 없어 401 Unauthorized 에러가 난다.
단순히 Controller 메소드에서 JWT Token을 받는 방법이 있지만, 모든 메소드에 추가하는 건 코드의 양과 가독성이 나빠져서 정말 비효율적인 코딩이 된다. 또한 Interceptor에서 JWT 인증에 대한 검사를 한다면 위에 언급한 방법은 무용지물이 된다.
인증 설정
Swagger 2.9.2부터 Authorize를 지원한다. Swagger Configuration 설정을 통해 Swagger GUI에서 간단하게 인증을 등록할 수 있다.
Authorize 버튼을 눌러보면 Swagger Configuration에서 설정한 정보를 바탕으로 값을 셋팅을 할 수 있다. 설정이 완료되면 Swagger의 모든 API는 JWT_TOKEN에 대한 인증정보를 기본적으로 가지고 API요청을 하게 된다.
Swagger Configuration
@Configuration
@EnableSwagger2
public class SwaggerConfiguration {
@Bean
public Docket swaggerSpringfoxDocket() {
Docket docket = new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.pathMapping("/")
.forCodeGeneration(true)
.genericModelSubstitutes(ResponseEntity.class)
.ignoredParameterTypes(java.sql.Date.class)
.securityContexts(Lists.newArrayList(securityContext()))
.securitySchemes(Lists.newArrayList(authorizationKey(), httpRequestKey()))
.useDefaultResponseMessages(false);
docket = docket
.select()
.apis(RequestHandlerSelectors.basePackage("com.tistory.reference.api"))
.paths(PathSelectors.any()).build();
return docket;
}
/**
* apiInfo
*
* @return
*/
private ApiInfo apiInfo() {
return new ApiInfo(
"reference-m1 System", // Title
"reference-m1 System APIs", // Description
"v1.0", // Version
"", // termsOfServiceUrl
new Contact("reference", "",""), // contact (Name, Url, Email)
"", // license
"", // licenseUrl
Collections.emptyList());
}
/**
* authorizationKey
*
* @return
*/
private ApiKey authorizationKey() {
return new ApiKey("JWT_TOKEN", ServiceConstant.AUTHORIZATION_KEY, "header");
}
/**
* httpRequestKey
*
* @return
*/
private ApiKey httpRequestKey() {
return new ApiKey("HTTP_REQUEST", ServiceConstant.X_REQUESTED_WITH_KEY, "header");
}
/**
* securityContext
*
* @return
*/
private springfox.documentation.spi.service.contexts.SecurityContext securityContext() {
return springfox.documentation.spi.service.contexts.SecurityContext.builder()
.securityReferences(defaultAuth())
.forPaths(PathSelectors.any())
.build();
}
/**
* defaultAuth
*
* @return
*/
private List<SecurityReference> defaultAuth() {
AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
authorizationScopes[0] = authorizationScope;
return Lists.newArrayList(new SecurityReference("JWT_TOKEN", authorizationScopes),
new SecurityReference("HTTP_REQUEST", authorizationScopes));
}
Swagger를 구성할때 기존에 설정한 정보에 JWT_TOKEN에 대한 소스만 추가하여 수정하면 된다.
필자는 JWT_TOKEN이외에 추가적인 인증이 있어서 2개를 기본 인증으로 설정하였다. JWT_TOKEN만 사용한다면 HTTP_REQUEST에 대한 부분을 삭제하고 사용하시면 된다.
눈여겨봐야 할 부분은 authorizationKey(), securityContext(), deaultAuth() 함수이다. 또한 SpringSecurity 또는 Interceptor를 사용한다면 Swagger관련 Path를 제외시켜야 한다.
/**
* WebSecurity ignore
*/
@Override public void configure(WebSecurity web) {
web.ignoring().antMatchers("/swagger/**", "/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/v2/api-docs");
}
/**
* url Interceptor
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authenticationInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/")
.excludePathPatterns("/swagger/**")
.excludePathPatterns("/swagger-ui.html")
.excludePathPatterns("/swagger-resources/**")
.excludePathPatterns("/webjars/**")
.excludePathPatterns("/v2/api-docs");
}
'프로그래밍 > Etc' 카테고리의 다른 글
[Etc] VSCode 들여쓰기 설정 (0) | 2021.02.15 |
---|---|
[Etc] GitLab Turn off email notifications on pipeline (0) | 2021.02.04 |
[Etc] jQuery는 과연 필요한가? (0) | 2020.09.09 |
[Etc] Git SSL certificate problem: self signed certificate (0) | 2020.05.25 |
[Etc] Git SourceTree 초기화 (2) | 2020.04.23 |
- 성능분석
- sort algorithm
- Tomcat
- React
- 리눅스 명령어
- 경력관리
- 개발환경
- javascript
- 제주도 여행
- 자바
- effective java
- Maven
- Eclipse
- Linux 명령어
- 오라클
- 제주도 3박4일 일정
- Collection
- 소프트웨어공학
- 이직
- 회고
- 프로그래머스
- 리액트 16
- 리액트
- spring
- 자바스크립트
- Java
- 오라클 내장 함수
- 정렬 알고리즘
- SQL
- 프로그래머
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |