From b6b3e393806f91094f9fffd6fc25ae0306da38a1 Mon Sep 17 00:00:00 2001 From: bum12ark Date: Mon, 28 Feb 2022 16:50:22 +0900 Subject: [PATCH] =?UTF-8?q?feat(owner-apigateway-service):=20with=20creden?= =?UTF-8?q?tials=20=EB=B0=8F=20exception=20handler=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - with credentials : true 옵션 추가 - 해당 옵션 추가로 인한 access-control-allow-origin : * 에서 vue 서버 아이피로 변경 - access token expired 일 경우 response body 추가 --- .../OwnerApigatewayServiceApplication.java | 8 ++++ .../handler/GlobalExceptionHandler.java | 46 +++++++++++++++++++ .../security/JwtTokenProvider.java | 2 +- .../src/main/resources/application.yml | 10 +++- 4 files changed, 63 insertions(+), 3 deletions(-) create mode 100644 owner-apigateway-service/src/main/java/com/justpickup/ownerapigatewayservice/handler/GlobalExceptionHandler.java diff --git a/owner-apigateway-service/src/main/java/com/justpickup/ownerapigatewayservice/OwnerApigatewayServiceApplication.java b/owner-apigateway-service/src/main/java/com/justpickup/ownerapigatewayservice/OwnerApigatewayServiceApplication.java index a739e2a..2bc155f 100644 --- a/owner-apigateway-service/src/main/java/com/justpickup/ownerapigatewayservice/OwnerApigatewayServiceApplication.java +++ b/owner-apigateway-service/src/main/java/com/justpickup/ownerapigatewayservice/OwnerApigatewayServiceApplication.java @@ -1,8 +1,11 @@ package com.justpickup.ownerapigatewayservice; +import com.justpickup.ownerapigatewayservice.handler.GlobalExceptionHandler; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.reactive.error.ErrorWebExceptionHandler; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; +import org.springframework.context.annotation.Bean; @SpringBootApplication @EnableEurekaClient @@ -12,4 +15,9 @@ public class OwnerApigatewayServiceApplication { SpringApplication.run(OwnerApigatewayServiceApplication.class, args); } + @Bean + public ErrorWebExceptionHandler globalExceptionHandler() { + return new GlobalExceptionHandler(); + } + } diff --git a/owner-apigateway-service/src/main/java/com/justpickup/ownerapigatewayservice/handler/GlobalExceptionHandler.java b/owner-apigateway-service/src/main/java/com/justpickup/ownerapigatewayservice/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..8c309cd --- /dev/null +++ b/owner-apigateway-service/src/main/java/com/justpickup/ownerapigatewayservice/handler/GlobalExceptionHandler.java @@ -0,0 +1,46 @@ +package com.justpickup.ownerapigatewayservice.handler; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.jsonwebtoken.ExpiredJwtException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.web.reactive.error.ErrorWebExceptionHandler; +import org.springframework.core.io.buffer.DataBuffer; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +import java.util.HashMap; +import java.util.Map; + +public class GlobalExceptionHandler implements ErrorWebExceptionHandler { + + @Autowired + private ObjectMapper objectMapper; + + @Override + public Mono handle(ServerWebExchange exchange, Throwable ex) { + + Class exceptionClass = ex.getClass(); + + Map responseBody = new HashMap<>(); + if (exceptionClass == ExpiredJwtException.class) { + exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); + exchange.getResponse().getHeaders().setContentType(MediaType.APPLICATION_JSON); + responseBody.put("code", "EXPIRED"); + responseBody.put("message", "Access Token is Expired!"); + } + + DataBuffer wrap = null; + try { + byte[] bytes = objectMapper.writeValueAsBytes(responseBody); + wrap = exchange.getResponse().bufferFactory().wrap(bytes); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + + return exchange.getResponse().writeWith(Flux.just(wrap)); + } +} diff --git a/owner-apigateway-service/src/main/java/com/justpickup/ownerapigatewayservice/security/JwtTokenProvider.java b/owner-apigateway-service/src/main/java/com/justpickup/ownerapigatewayservice/security/JwtTokenProvider.java index f5752f5..e4f4767 100644 --- a/owner-apigateway-service/src/main/java/com/justpickup/ownerapigatewayservice/security/JwtTokenProvider.java +++ b/owner-apigateway-service/src/main/java/com/justpickup/ownerapigatewayservice/security/JwtTokenProvider.java @@ -85,7 +85,7 @@ public class JwtTokenProvider { return false; } catch (ExpiredJwtException e) { log.error("JWT token is expired: {}", e.getMessage()); - return false; + throw e; } catch (UnsupportedJwtException e) { log.error("JWT token is unsupported: {}", e.getMessage()); return false; diff --git a/owner-apigateway-service/src/main/resources/application.yml b/owner-apigateway-service/src/main/resources/application.yml index a4635b5..5c7ae5e 100644 --- a/owner-apigateway-service/src/main/resources/application.yml +++ b/owner-apigateway-service/src/main/resources/application.yml @@ -17,7 +17,7 @@ spring: globalcors: cors-configurations: '[/**]': - allowedOrigins: "*" + allowedOrigins: "http://localhost:8080" allowedMethods: - GET - POST @@ -25,6 +25,7 @@ spring: - PUT - OPTIONS allowedHeaders: '*' + allow-credentials: true routes: - id: owner-frontend-service uri: lb://OWNER-FRONTEND-SERVICE @@ -32,18 +33,22 @@ spring: - Path=/owner-frontend-service/** filters: - RewritePath=/owner-frontend-service/(?.*),/$\{segment} + - id: order-service uri: lb://ORDER-SERVCIE predicates: - Path=/order-service/** filters: - RewritePath=/order-service/(?.*),/$\{segment} + - AuthorizationHeaderFilter + - id: store-service uri: lb://STORE-SERVCIE predicates: - Path=/store-service/** filters: - RewritePath=/store-service/(?.*),/$\{segment} + - id: user-service uri: lb://USER-SERVICE predicates: @@ -54,7 +59,7 @@ spring: - id: user-service uri: lb://USER-SERVICE predicates: - - Path=/user-service/refreshToken + - Path=/user-service/auth/reissue - Method=GET filters: - RewritePath=/user-service/(?.*),/$\{segment} @@ -78,6 +83,7 @@ spring: - Path=/user-service/** filters: - RewritePath=/user-service/(?.*),/$\{segment} + - AuthorizationHeaderFilter token: access-expired-time: 3600000