개발 - 안드로이드

구글 로그인 - 백엔드 스프링 프레임워크

개미v 2024. 6. 20. 22:23
반응형

구글 로그인은 다음과 같은 방식으로 처리 됩니다.

 

① 프론트엔드(안드로이드) 에서 구글 로그인을 하면

② 인증토큰을 백엔드 서버로 보내고

③ 백엔드 서버에서는 인증토큰이 유효한지 구글 서버로 보내서 검증합니다.

④ 인증토큰이 유효하면 인증토큰에서 아이디, 이메일을 추출해서 사용할 수 있습니다.

⑤ 이후 회원가입 처리

 

※ 프론트엔드(안드로이드) 에서 인증토큰에서 바로 아이디, 이메일을 추출해서 사용할 수도 있겠지만,

이렇게 하면 위변조가 가능하기 때문에 구글 서버에서 검증을 해야 합니다.

 

 

백엔드 스프링 프레임워크에서 구글 인증토큰 검증하는 예제 입니다.

 

maven

<dependency>
	<groupId>com.google.api-client</groupId>
	<artifactId>google-api-client</artifactId>
	<version>1.26.0</version>
</dependency>

<dependency>
	<groupId>com.google.oauth-client</groupId>
	<artifactId>google-oauth-client</artifactId>
	<version>1.26.0</version>
</dependency>

<dependency>
	<groupId>com.google.http-client</groupId>
	<artifactId>google-http-client</artifactId>
	<version>1.26.0</version>
</dependency>

<dependency>
	<groupId>com.google.http-client</groupId>
	<artifactId>google-http-client-jackson2</artifactId>
	<version>1.26.0</version>
</dependency>

<dependency>
	<groupId>com.google.guava</groupId>
	<artifactId>guava</artifactId>
	<version>27.0.1-jre</version>
</dependency>

 

 

Controller

// 구글 로그인
@RequestMapping(value = "/loginGoogleOAuth.ajax", produces = "application/json; charset=UTF8", method = RequestMethod.POST)
@ResponseBody
public Map<String, Object> loginGoogleOAuth(@RequestParam Map<String, Object> param, HttpServletRequest request,
		HttpServletResponse response, Model model, HttpSession session) throws Exception {

	Map<String, Object> map = new HashMap<String, Object>();

	try {
		// 구글 인증토큰 파라미터
		String authToken = param.get("authToken");
		
		// 구글 인증토큰 검증
		HttpTransport transport = new NetHttpTransport();
		JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
		GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, jsonFactory)
				.setAudience(Collections.singletonList(PropertiesUtil.getProperty("oauth.google.clientId")))
				.build();
		GoogleIdToken idToken = verifier.verify(authToken);
		if (idToken == null) {
			map.put("code", "false");
			map.put("msg", "Google authentication token verification failed.");
			return map;
		}

		// 인증토큰에서 id, email 확인
		Payload payload = idToken.getPayload();
		String userId = payload.getSubject();
		String userEmail = payload.getEmail();

		// TODO : 회원가입 처리


		map.put("code", "true");
		map.put("msg", "Request was successful.");
		return map;

	} catch (Exception e) {
		map.put("code", "false");
		map.put("msg", "Unknown error has occurred on the server.\nError : " + e.toString());
		return map;
	}
}

 

 

※ oauth.google.clientId 값은 구글 클라우드 콘솔의 API 설정에서 웹 서버의 클라이언트ID값입니다.

ex) 0000000000000-aaaaamd2nlm9ojqpjp92bivtkhi00000.apps.googleusercontent.com

반응형