ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • OAuth 구글 인증 로그인(Google login) #2(스프링 작성)
    카테고리 없음 2019. 5. 8. 19:46

    OAuth 구글 인증 로그인 프로젝트 작성 절차

    구글 API 사용하기 위해 다음 두 모듈 디펜던시 추가

    Google API 사용하기 위한 빈 객체 생성. 똑같이 적으면 되는데 바뀌는 부분은 초록색 으로 밑줄 친 부분이다. 구글 클라우드 플랫폼에서 생성했던 사용자 인증 정보 및 승인된 리디렉션 URI를 속성 값으로 등록한다.

    이전 포스팅 참조

    https://blog.naver.com/p952973/221028003470

    로그인 시 필요한 로직이고, 회원가입 관련 내용은 MemberController 에 작성해두었다. 등록한 객체를 사용하기 위해 MemberController 빈 객체에도 등록

    MemberController에 멤버와 세터 추가한다.

    로그인 요청 코드. 다음과 같이 코드 작성하면 String 객체에 사용자 정보가 담긴 요청을 받아올 수 있다. 이 요청이 Bean 객체에 등록한 redirectUri 속성이다. 이 요청을 브라우저로 보내 location.href 등을 통해 재요청하면 된다.

     @RequestMapping(value = "/member/googleSignIn", method = RequestMethod.POST)
    	public void doGoogleSignInActionPage(HttpServletResponse response) {
    		OAuth2Operations oauthOperations = googleConnectionFactory.getOAuthOperations();
    		String url = oauthOperations.buildAuthorizeUrl(GrantType.AUTHORIZATION_CODE, googleOAuth2Parameters);
    		//System.out.println("/member/googleSignIn, url : " + url);
    		
    		PrintWriter out;
    		try {
    			out = response.getWriter();
    			out.write(url);
    			out.flush();
    			out.close();
    		} catch (IOException e) {
    			throw new RuntimeException(e.getMessage(), e);
    		}
    		
    	}
    
    @RequestMapping("/member/googleSignInCallback")
    	public String doSessionAssignActionPage(HttpServletRequest request){
    		System.out.println("/member/googleSignInCallback");
    		String code = request.getParameter("code");
    		
    		OAuth2Operations oauthOperations = googleConnectionFactory.getOAuthOperations();
    		AccessGrant accessGrant = oauthOperations.exchangeForAccess(code , googleOAuth2Parameters.getRedirectUri(),
    				null);
    		
    		String accessToken = accessGrant.getAccessToken();
    		Long expireTime = accessGrant.getExpireTime();
    		if (expireTime != null && expireTime < System.currentTimeMillis()) {
    			accessToken = accessGrant.getRefreshToken();
    			System.out.printf("accessToken is expired. refresh token = {}", accessToken);
    		}
    		Connection connection = googleConnectionFactory.createConnection(accessGrant);
    		Google google = connection == null ? new GoogleTemplate(accessToken) : connection.getApi();
    		
    		PlusOperations plusOperations = google.plusOperations();
    		Person person = plusOperations.getGoogleProfile();
    		
    		MemberVO member = new MemberVO();
    		member.setNickName(person.getDisplayName());
    		member.setAuth("USR");
    
    		HttpSession session = request.getSession();
    		session.setAttribute("_MEMBER_", member );
    		
    		System.out.println(person.getDisplayName());
    		
    		return "redirect:/";
    		/*System.out.println(person.getAccountEmail());
    		System.out.println(person.getAboutMe());
    		System.out.println(person.getDisplayName());
    		System.out.println(person.getEtag());
    		System.out.println(person.getFamilyName());
    		System.out.println(person.getGender());
    		*/
    		
    	}
    

     

    재요청 url 컨트롤러. 요청 매개변수 중 'code' 의 정보를 파싱해 구글 인증한 사용자 정보를 가져올 수 있다. 구글에서 Person 객체를 제공하며 다음과 같은 값들을 가져올 수 있다.

    (Null 값이 나오는 것들이 있는데 이게 API 인증 키와 관련 있는 것으로 예상된다. 세션을 따로 생성해 관리하는 식으로 사용할 것이라 해결 방법은 고민해보지 않았다. 이것만 해결하는데도 2일 넘게 걸렸기 때문에...)

    로그아웃 시 다음과 같이 세션을 끊는다. 구글 로그아웃할 때는 로그아웃 요청을 보내고 해당 팝업을 닫는 방법으로 동작시켰다.

Designed by Tistory.