[Spring] 구글 로그인 API

Posted by 신희준 on December 1, 2017



2017 - 12 - 01 (금)


구글 로그인 appId


1 . 구글 클라우드 플랫폼 에서 프로젝트 생성 후 앱등록 및 앱키를 발급 받는다.

2 . 사용자 인증 정보에서 redirection uri 및 자바스크립트 원본 , 이름을 설정해준다.

Post Sample Image

3 . 클라이언트 id 와 보안 비밀을 메모해 놓는다.

4 . 라이브러리에서 Google+ API 에서 사용설정을 눌러준다.

5 . pom.xml 에 라이브러리 추가

<dependency>
  <groupId>org.springframework.social</groupId>
  <artifactId>spring-social-google</artifactId>
  <version>1.0.0.RELEASE</version>
</dependency>

<dependency>
  <groupId>org.apache.httpcomponents</groupId>
  <artifactId>httpclient</artifactId>
  <version>4.5.3</version>
</dependency>

6 . root_context.xml 에 dependency 추가

<!-- google Class Bean설정 추가 -->
<!-- 클라이언트ID와 보안비밀 세팅 -->
<bean id="googleConnectionFactory"
  class="org.springframework.social.google.connect.GoogleConnectionFactory">
  <constructor-arg
    value="클라이언트ID" />
  <constructor-arg value="보안비밀" />
</bean>
<!-- 승인된 자바스크립트 원본과 승인된 리디렉션 URI -->
<bean id="googleOAuth2Parameters"
  class="org.springframework.social.oauth2.OAuth2Parameters">
  <property name="scope"
    value="https://www.googleapis.com/auth/plus.login" />
  <property name="redirectUri"
    value="http://localhost/user/googleSignInCallback" />
</bean>

7 . user/googleLogin URI 에 매핑되는 Controller 및 구글에 인증 요청 후 앞서 RedirectionUri 패스로 매핑되는 Controller 작성

@RequestMapping(value = "/googleLogin", method = RequestMethod.POST)
public String doGoogleSignInActionPage(HttpServletResponse response, Model model) throws Exception{
  OAuth2Operations oauthOperations = googleConnectionFactory.getOAuthOperations();
  String url = oauthOperations.buildAuthorizeUrl(GrantType.AUTHORIZATION_CODE, googleOAuth2Parameters);
  System.out.println("/member/googleSignIn, url : " + url);
  model.addAttribute("url",url);
  return "login/googleLogin";

}
@RequestMapping(value = "/googleSignInCallback", method = RequestMethod.GET)
public String doSessionAssignActionPage(HttpServletRequest request)throws Exception{
  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<Google> connection = googleConnectionFactory.createConnection(accessGrant);
  Google google = connection == null ? new GoogleTemplate(accessToken) : connection.getApi();

  PlusOperations plusOperations = google.plusOperations();
  Person profile = plusOperations.getGoogleProfile();
  UserVO vo = new UserVO();
  System.out.println(profile.getDisplayName());
  vo.setUser_email("구글 로그인 계정");
  vo.setUser_name(profile.getDisplayName());
  vo.setUser_snsId("g"+profile.getId());
  HttpSession session = request.getSession();
  vo = service.googleLogin(vo);

  session.setAttribute("login", vo );


  return "redirect:/";
}

8 . self.location 으로 구글에 인증요청할 login/googleLogin.jsp 생성 자동으로 google 에 요청을하고 지정한 redirectionUri 로 매핑되어 컨트롤러 메서드를 실행한다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>NaverLogin</title>

</head>
<body>
	<script>
		self.location = '${url}';
	</script>
</body>

</html>