2017 - 12 - 01 (금)
구글 로그인 appId
1 . 구글 클라우드 플랫폼 에서 프로젝트 생성 후 앱등록 및 앱키를 발급 받는다.
2 . 사용자 인증 정보에서 redirection uri 및 자바스크립트 원본 , 이름을 설정해준다.
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>