반응형
구글 로그인은 다음과 같은 방식으로 처리 됩니다.
① 프론트엔드(안드로이드) 에서 구글 로그인을 하면
② 인증토큰을 백엔드 서버로 보내고
③ 백엔드 서버에서는 인증토큰이 유효한지 구글 서버로 보내서 검증합니다.
④ 인증토큰이 유효하면 인증토큰에서 아이디, 이메일을 추출해서 사용할 수 있습니다.
⑤ 이후 회원가입 처리
※ 프론트엔드(안드로이드) 에서 인증토큰에서 바로 아이디, 이메일을 추출해서 사용할 수도 있겠지만,
이렇게 하면 위변조가 가능하기 때문에 구글 서버에서 검증을 해야 합니다.
백엔드 스프링 프레임워크에서 구글 인증토큰 검증하는 예제 입니다.
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
반응형
'개발 - 안드로이드' 카테고리의 다른 글
안드로이드 Debug, Release SHA-1 해시값 구하는 방법 (0) | 2024.06.18 |
---|---|
안드로이드 Fragment에서 windowSoftInputMode 바꾸는 방법 (0) | 2024.06.18 |
안드로이드 fragment에서 editText.requestFocus() 안되는 경우 (0) | 2023.10.11 |
안드로이드 listView notifyDataSetChanged 0 → 1 신규 추가시는 동작 안함 해결 (0) | 2023.10.08 |
안드로이드 ListView 멀티 아이템 (0) | 2023.10.03 |