// 사용자가 승인 또는 거부 버튼을 클릭하는 경우 @RequestMapping(value = "auth", method = RequestMethod.POST) public String authorizePost( Model model, RequestAuthVO rVO, HttpServletRequest request, HttpServletResponse response) throws OAuth2Exception { // 0. request 값 얻어내기 String isAllow = request.getParameter("isallow"); String userid = request.getParameter("userid"); String password = request.getParameter("password"); // 0.1 로그인한 사용자면 현재사용자와 해당 클라이언트를 위한 Token을 생성해야 함. // 0.2 userid,password로 사용자 정보 조회--> 로그인처리--> 토큰 생성 // 0.3 사용자가 승인을 거부하였다면 사용자에게 알려주고 로그인화면으로 돌아감. if (!isAllow.equals("true")) { return "auth/auth_deny"; } UserVO uVO = null; if (userid != null && password != null) { UserVO uVOTemp = new UserVO(userid, password, "", 0); try { uVO = dao.loginProcess(uVOTemp); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); return "auth/auth.jsp"; } } else if (request.getSession().getAttribute("userVO") != null) { uVO = (UserVO) request.getSession().getAttribute("userVO"); } else { throw new OAuth2Exception(401, OAuth2ErrorConstant.UNAUTHORIZED_CLIENT); } // 1. client_id 존재여부 확인 ClientVO cVOTemp = new ClientVO(); cVOTemp.setClient_id(rVO.getClient_id()); System.out.println("## rVO ClientID : " + rVO.getClient_id()); ClientVO cVO; try { cVO = dao.getClientOne(cVOTemp); } catch (Exception e) { // TODO Auto-generated catch block throw new OAuth2Exception(400, OAuth2ErrorConstant.SERVER_ERROR); } if (cVO == null) { throw new OAuth2Exception(400, OAuth2ErrorConstant.UNAUTHORIZED_CLIENT); } // 2. scope 포함여부 확인 if (!OAuth2Scope.isScopeValid(rVO.getScope(), cVO.getScope())) { throw new OAuth2Exception(400, OAuth2ErrorConstant.INVALID_SCOPE); } // 3. redirect_uri 일치여부 확인 if (!rVO.getRedirect_uri().equals(cVO.getRedirect_uri())) { throw new OAuth2Exception(400, OAuth2ErrorConstant.NOT_MATCH_REDIRECT_URI); } // 4. token, code 생성하여 테이블에 추가, // refresh token을 사용하지 않을 경우는 테이블에 저장된 값에서 code 필드값만 사용함 TokenVO tVO = createTokenToTable(rVO, uVO, cVO); // 5. response_type 확인하고 code, token인 경우에 따라 각기 다른 흐름 처리 String response_type = rVO.getResponse_type(); String redirect = ""; if (response_type.equals(OAuth2Constant.RESPONSE_TYPE_CODE)) { // 6.1 4번 단계에서 생성된 값들 중 code 값을 이용해 redirect 함. // redirect_uri?code=XXXXXXXXX redirect = "redirect:" + rVO.getRedirect_uri() + "?code=" + tVO.getCode(); if (rVO.getState() != null) { redirect += "&state=" + rVO.getState(); } } else if (response_type.equals(OAuth2Constant.RESPONSE_TYPE_TOKEN)) { // useragent 흐름 ResponseAccessTokenVO tokenVO = null; if (OAuth2Constant.USE_REFRESH_TOKEN) { tokenVO = new ResponseAccessTokenVO( tVO.getAccess_token(), tVO.getToken_type(), tVO.getExpires_in(), tVO.getRefresh_token(), rVO.getState(), tVO.getCreated_at()); } else { // OAuth2AccessToken 클래스 기능을 이용해 정해진 규칙에 의해 생성함. tokenVO = new ResponseAccessTokenVO( this.tokenService.generateAccessToken( cVO.getClient_id(), cVO.getClient_secret(), uVO.getUserid(), password), OAuth2Constant.TOKEN_TYPE_BEARER, 0, null, rVO.getState(), tVO.getCreated_at()); tokenVO.setExpires_in(0); tokenVO.setRefresh_token(null); } String acc = OAuth2Util.getAccessTokenToFormUrlEncoded(tokenVO); redirect = "redirect:" + rVO.getRedirect_uri() + "#" + acc; } else { throw new OAuth2Exception(400, OAuth2ErrorConstant.UNSUPPORTED_RESPONSE_TYPE); } return redirect; }
@RequestMapping(value = "auth", method = RequestMethod.GET) public ModelAndView authorize( RequestAuthVO vo, HttpServletResponse response, HttpServletRequest request) throws OAuth2Exception { ModelAndView mav = new ModelAndView(); HttpSession session = request.getSession(); UserVO loginnedVO = (UserVO) session.getAttribute("userVO"); // 1. 현재 로그인한 상태인지 확인 if (loginnedVO != null) { // 이미 로그인한 상황이면 승인버튼만 보여주도록 해야 함. mav.addObject("isloginned", true); } else { mav.addObject("isloginned", false); } System.out.println("## server flow 2.1"); // 2.1 전달된 client_id가 유효한 client_id인지 확인 ClientVO clientVO1 = new ClientVO(); clientVO1.setClient_id(vo.getClient_id()); ClientVO cVO = null; try { cVO = dao.getClientOne(clientVO1); } catch (Exception e) { e.printStackTrace(); throw new OAuth2Exception(500, OAuth2ErrorConstant.SERVER_ERROR); } if (cVO == null) { throw new OAuth2Exception(401, OAuth2ErrorConstant.UNAUTHORIZED_CLIENT); } System.out.println("## server flow 2.2"); System.out.println(vo.getResponse_type()); // 2.2 response_type이 code일 때는 client_secret이 일치하는지도 확인함. if (!vo.getResponse_type().equals(OAuth2Constant.RESPONSE_TYPE_CODE) && !vo.getResponse_type().equals(OAuth2Constant.RESPONSE_TYPE_TOKEN)) { throw new OAuth2Exception(401, OAuth2ErrorConstant.UNSUPPORTED_RESPONSE_TYPE); } System.out.println("## server flow 3"); // 3. 요청으로 전달된 scope가 client 등록시 포함된 scope에 존재하는지 여부 확인 if (!OAuth2Scope.isScopeValid(vo.getScope(), cVO.getScope())) { throw new OAuth2Exception(400, OAuth2ErrorConstant.INVALID_SCOPE); } System.out.println("## server flow 4"); // 4. grant_type이 유효한지 확인 String gt = vo.getResponse_type(); if (!gt.equals(OAuth2Constant.RESPONSE_TYPE_CODE) && !gt.equals(OAuth2Constant.RESPONSE_TYPE_TOKEN)) { throw new OAuth2Exception(400, OAuth2ErrorConstant.UNSUPPORTED_RESPONSE_TYPE); } System.out.println("## server flow 5"); // 5 최종적으로 유효하다면 auth/auth.jsp 를 보여줌. mav.addObject("requestAuthVO", vo); mav.addObject("clientVO", cVO); mav.setViewName("auth/auth"); return mav; }