내용

글번호 716
작성자 허진경
작성일 2017-07-12 20:58:08
제목 구글 싸인인 처리 컨트롤러
내용 Google signin controller
import java.util.Collections;

import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.util.UriComponentsBuilder;

import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken;
import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken.Payload;
import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;

import kr.co.javaspecialist.member.model.GoogleUserVO;
import kr.co.javaspecialist.member.service.IMemberService;

@Controller
public class GoogleSignInController {
	
	static final Logger logger = Logger.getLogger(GoogleSignInController.class);

	@Autowired
	IMemberService memberService;
	
	private static final HttpTransport transport = new NetHttpTransport();
	private static final  JsonFactory jsonFactory = new JacksonFactory();

	@RequestMapping("/tokensignin")
	public ResponseEntity<?> tokenSignIn(String idtoken, HttpSession session, UriComponentsBuilder uriBuilder) {
		HttpHeaders headers = new HttpHeaders();
		
		GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, jsonFactory)
				.setAudience(Collections.singletonList("97906395215-c9pitm8nc7oc49si11ltdt11sskcmcn0.apps.googleusercontent.com"))
				// Or, if multiple clients access the backend:
				//.setAudience(Arrays.asList(CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3))
				.build();

		// (Receive idTokenString by HTTPS POST)

		GoogleIdToken idToken;
		try {
			idToken = verifier.verify(idtoken);
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
		
		if (idToken != null) {
			Payload payload = idToken.getPayload();

			// Print user identifier
			String userId = payload.getSubject();
			logger.info("User ID: " + userId);

			// Get profile information from payload
			GoogleUserVO googleUser = new GoogleUserVO();
			googleUser.setEmail((String)payload.getEmail());
			boolean emailVerified = Boolean.valueOf(payload.getEmailVerified());
			if(emailVerified) {
				googleUser.setEmailVerified("Y");
			}else {
				googleUser.setEmailVerified("N");
			}
			googleUser.setName((String) payload.get("name"));
			googleUser.setPicture((String) payload.get("picture"));
			googleUser.setLocale((String) payload.get("locale"));
			googleUser.setFamilyName((String) payload.get("family_name"));
			googleUser.setGivenName((String) payload.get("given_name"));

			logger.info(googleUser);

			session.setAttribute("name", googleUser.getName());
			session.setAttribute("email", googleUser.getEmail());

			// Use or store profile information
			memberService.insertGoogleSignIn(googleUser);

			if(session!=null && session.getAttribute("url")!=null) {
				String param = (String)session.getAttribute("param");
				if(param == null) {
					headers.setLocation(uriBuilder.path((String)session.getAttribute("url")).build().toUri());
				}else {
					headers.setLocation(uriBuilder.path((String)session.getAttribute("url") + "?" + param).build().toUri());
				}
			}
		} else {
			throw new RuntimeException("Invalid ID token.");
		}
		headers.setLocation(uriBuilder.path("/").build().toUri());
		return new ResponseEntity<Void>(headers, HttpStatus.OK);
	}
}