فهرست منبع

20190502 중간 커밋 - 갱신 시 헤더 검사 추가

leeheejo 6 سال پیش
والد
کامیت
65dd4c22b2

+ 35 - 5
java/com/icontrols/oauth/controller/OAuthController.java

@@ -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)

+ 8 - 3
src/main/webapp/WEB-INF/jsp/InsertCode.jsp

@@ -28,7 +28,7 @@ body {
 	function btnClickHandler() {
 		var code = $("#code").val();
 		if (code == "")
-			alert("월패드에 표시된 코드를 입력하세요.");
+			alert("월패드에 표시된 인증번호를 입력하세요.");
 		else {
 			console.log(code);
 			$.ajax({
@@ -42,7 +42,7 @@ body {
 											if (data == true) {
 												window.location.href = 'https://teldev.hdc-smart.com:443/api/oauth2/code/generate';
 												} else {
-												alert("월패드 코드 인증 실패");
+												alert("인증 실패");
 												}
 											}
 					});
@@ -51,10 +51,15 @@ body {
 	}
 </script>
 <body>
+	<div class = "myclass" align="center">
+		<img src="/resources/img/incon_ci_ko.png"/>
+	</div>
+	<br>
+	<br>
 	<!-- <form method="post" action="validate"> -->
 	<div class="myclass">
 		<label for="code">인증번호</label> <input type="text" class="form-control"
-			id="code" name="code" required> <br> <br>
+			id="code" name="code" placeholder="월패드에 뜬 인증번호를 입력하세요." required> <br>
 		<input type="button" class="btn btn-primary btn-block" onClick="javascript:btnClickHandler();"value ="인증하기"/>
 	</div>
 </body>

+ 36 - 8
src/main/webapp/WEB-INF/jsp/InsertUserInfo.jsp

@@ -28,13 +28,31 @@ body {
 		margin: 0 auto;
 	}
 }
+
+.test {
+	align: middle;
+}
+
+p {
+	border-radius: .25rem;
+	background-color: #DDDDDD;
+	font-size: 12px;
+	text-align: left;
+	padding: 10px;
+}
+
 </style>
 </head>
 
 <body>
+	<div class = "myclass" align="center">
+		<img src="/resources/img/incon_ci_ko.png"/>
+	</div>
+	<br>
+	<br>
 	<form method="get" action="user/info/submit" class = "myclass">
-	
-		<label for="complex">단지</label> 
+
+		<label for="complex">단지정보</label> 
 		<select class="form-control" id="complex" name="complex" required>
 			<option value="">단지명</option>
 			<c:forEach items="${complexInfos}" var="row">
@@ -42,15 +60,25 @@ body {
 			</c:forEach>
 		</select> 
 		<br>
-		<label for="dong"></label> 
-		<input type="text" class="form-control" id="dong" name="dong" required>
+		<label for="dong">세대정보</label> 
+		<input type="text" class="form-control" id="dong" name="dong" placeholder="동" required>
 		<br> 
-		<label for="ho">호</label> 
-		<input type="text" class="form-control" id="ho" name="ho" required>
+		<input type="text" class="form-control" id="ho" name="ho" placeholder="호" required>
 		<br> 
-		<br>
-		<button id="submit" name ="submit" type="submit" class="btn btn-primary btn-block">Submit</button>
+		<button type="submit" class="btn btn-primary btn-block">인증번호 전송하기</button>
 	</form>
+	<br>
+	<div class = "myclass" align="center">
+		<p>
+			*인증방법* 
+			<br>
+			1. 월패드에서 "설정">"모바일기기등록" 화면에 진입한 후, 중앙하단에 "+등록" 버튼을 누르면 팝업창이 뜹니다.
+			<br>
+			2. 팝업창을 띄운 상태에서 세대정보를 입력하고 "인증번호 전송하기"를 누르면 해당 세대 월패드에 인증번호가 전송됩니다.
+			<br>
+			3. 월패드에 출력된 인증번호를 입력하고 "인증하기" 버튼을 누르면 인증이 완료됩니다.			
+		</p>
+	</div>
 
 </body>
 </html>