Swagger Jwt 인증(access, refresh)

코딩을 합시다·2023년 2월 20일
0

Swagger로 access 토큰과 refresh 토큰 두개를 인증하는 코드이다.


build.gradle

// Swagger
    implementation group: 'io.springfox', name: 'springfox-boot-starter', version: '3.0.0'
    implementation group: 'io.springfox', name: 'springfox-swagger-ui', version: '3.0.0'

SwaggerConfig.java

package shop.dodotalk.dorundorun.swagger.config;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.*;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import java.util.*;

@Configuration
@EnableSwagger2
public class SwaggerConfig extends WebMvcConfigurationSupport {
    @Bean
    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2)
                .useDefaultResponseMessages(false) // swagger default response message 삭제
                .securityContexts(securityContext()) // swagger에서 jwt 토큰값 넣기위한 설정
                .securitySchemes(apiKey()) // swagger에서 jwt 토큰값 넣기위한 설정
                .select()
                .apis(RequestHandlerSelectors.basePackage("shop.dodotalk.dorundorun"))
                .paths(PathSelectors.ant("/api/**"))
                .build()
                .apiInfo(apiInfo());
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("DoRun")
                .description("DorunDorun의 API명세서.")
                .version("1.0")
                .build();
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/swagger-ui/**").addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/");
        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/");
    }

    private List<SecurityScheme> apiKey() {
        List<SecurityScheme> apiKeyList = new ArrayList<>();
        apiKeyList.add(new ApiKey("Access", "Authorization", "header"));
        apiKeyList.add(new ApiKey("Refresh", "Refresh", "header"));
        return apiKeyList;
    }

    private List<SecurityContext> securityContext() {
        List<SecurityContext> contextList = new ArrayList<>();
        contextList.add(SecurityContext.builder().securityReferences(defaultAuth("Access")).build());
        contextList.add(SecurityContext.builder().securityReferences(defaultAuth("Refresh")).build());
        return contextList;
    }

    private List<SecurityReference> defaultAuth(String apiKey) {
        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
        authorizationScopes[0] = authorizationScope;
        return Arrays.asList(new SecurityReference(apiKey, authorizationScopes));
    }

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json()
                .featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
                .build();
        converters.add(new MappingJackson2HttpMessageConverter(objectMapper));
        super.configureMessageConverters(converters);
    }
}

먼저 코드에 대한 설명을 하자면

  1. securityContexts는 Swagger에서 보안 설정을 구성하는 메서드이다.
  2. securitySchemes는 Swagger에서 API 보안을 위해 사용하는 Security Scheme을 설정하는 메서드입니다. Security Scheme은 API에 대한 보안 기능을 정의하며, 대부분 API 인증을 위해 사용한다.
  3. SecurityReference는 보안 참조에 대한 정보를 담고 있는 클래스입니다.
    SecurityContext에서 사용되며, API의 보안 구성에 대한 참조를 정의하는 데 사용됩니다. 즉, 보안 구성에 대한 정보를 SecurityReference에 담아 SecurityContext에 전달하여 해당 보안 구성을 적용할 수 있습니다

이것은 security에 대한 설정이다.

Authorize가 생긴걸 볼 수 있고 클릭해서 토큰값을 넣어서 테스트를 해볼 수 있다

정상적으로 잘 나오는 모습

0개의 댓글