|
@@ -250,7 +250,8 @@ public class OAuthController {
|
|
|
@RequestMapping(value = "/token", method = RequestMethod.POST, produces = "application/json")
|
|
|
public @ResponseBody Token Token(@RequestParam(value = "grant_type", required = true) String grantType,
|
|
|
@RequestParam(value = "code", required = false) String code,
|
|
|
- @RequestParam(value = "refresh_token", required = false) String refreshToken, HttpSession httpSession)
|
|
|
+ @RequestParam(value = "refresh_token", required = false) String refreshToken, HttpSession httpSession,
|
|
|
+ @RequestHeader HttpHeaders headers)
|
|
|
throws NoSuchAlgorithmException, UnsupportedEncodingException, GeneralSecurityException {
|
|
|
|
|
|
logger.info("[STEP #5] /api/oauth2/token");
|
|
@@ -286,14 +287,15 @@ public class OAuthController {
|
|
|
|
|
|
}
|
|
|
} else if (grantType.equals("refresh_token")) {
|
|
|
- // TODO refreshToken 검사
|
|
|
- // jwt토큰 디코딩해서 내역 검사해야됨.
|
|
|
- // 시그니처 확인해야됨
|
|
|
if (refreshToken != null) {
|
|
|
Boolean bool = JWTUtils.validateToken(refreshToken, "refreshToken");
|
|
|
- logger.info(bool.toString());
|
|
|
if (bool) {
|
|
|
// TODO token의 payload에서 compelxCd, homeId 가져오고 새로 토큰 생성한다
|
|
|
+ if (headers.get("Authorization").get(0) == null)
|
|
|
+ throw new ResponseStatusException(HttpStatus.UNAUTHORIZED, ERROR.INVALID_CLIENT);
|
|
|
+
|
|
|
+ if (!validateHeaderAuth(headers.get("Authorization").get(0)))
|
|
|
+ throw new ResponseStatusException(HttpStatus.UNAUTHORIZED, ERROR.INVALID_CLIENT);
|
|
|
|
|
|
JWTInfo jwtinfo = JWTUtils.getJWTInfoFromToken(refreshToken);
|
|
|
newAccessToken = JWTUtils.generateToken(jwtinfo, "accessToken");
|
|
@@ -315,6 +317,34 @@ public class OAuthController {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ public boolean validateHeaderAuth(String authorization) {
|
|
|
+ String splitStr[] = authorization.split(" ");
|
|
|
+
|
|
|
+ // splitStr length 가 2가 아니면 유효하지 않은 authorization 값
|
|
|
+ if (splitStr.length != 2)
|
|
|
+ return false;
|
|
|
+
|
|
|
+ // splitStr이 Basic이 아니어도 에러
|
|
|
+ if (!splitStr[0].equals("Basic"))
|
|
|
+ return false;
|
|
|
+
|
|
|
+ // Base64 디코드
|
|
|
+ String decodeStr = new String(Base64.getDecoder().decode(splitStr[1]));
|
|
|
+
|
|
|
+ splitStr = decodeStr.split(":");
|
|
|
+ // splitStr length 가 2가 아니면 유효하지 않은 authorization 값
|
|
|
+ if (splitStr.length != 2)
|
|
|
+ return false;
|
|
|
+
|
|
|
+ ClientInfo clientInfo = clientInfoRepo.findByClientId(splitStr[0]);
|
|
|
+ if (clientInfo == null)
|
|
|
+ return false;
|
|
|
+ if (!clientInfo.getClientSecret().equals(splitStr[1]))
|
|
|
+ return false;
|
|
|
+
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
// ((Test)) Redirect Destination
|
|
|
// 여기는 리다이렉트 받는 URl임 테스트용. Client를 대신함.
|
|
|
@RequestMapping(value = "/redirect", method = RequestMethod.GET)
|