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