ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • OAuth 구글 인증 로그인(Google login) #2(스프링 작성)
    OAuth 2019. 6. 5. 22:52

    구글 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);
    		}
    		
    	}
      

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

    @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());
    		*/
    		
    	}
    

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

    'OAuth' 카테고리의 다른 글

    OAuth 구글 인증 로그인(Google login) #1(환경설정)  (0) 2019.05.08
Designed by Tistory.