구글 API에서 제공하는 라이브러리를 사용하여 Google의 REST 서비스를 사용하는 코드입니다.
GoogleCredential credential = new GoogleCredential()
.setAccessToken(accessToken);
Plus plus = Plus.builder(new NetHttpTransport(),
GsonFactory.getDefaultInstance(),
credential)
.setApplicationName("Google-PlusAmple/1.0")
.build();
이런 jar파일을 쓰면
스프링 프레임워크를 사용하지 않아도
OAuth 2.0 앤드포인트를 호출할 수 있습니다.
1) Java 기본 코드로 호출
2) Google이 제공하는 라이브러리 (jar) 호출
3) Spring Framework의 RestTemplate
을 통해 호출 ( OpenFeign
도 고려 가능 )
Google Rest Service를 사용하기 위한 토큰을 얻을 수 있는 플로우입니다.
크게
코드 발급 / 토큰 발급 / 토큰을 이용한 유저의 정보 가져오기
단계로 나눌 수 있습니다.
@PropertySource("classpath:lec14-oauth.properties")
@Controller
public class GooglCallTestCtl {
@Value("${google.loginform.url}")
private String LOGIN_FORM_URL;
@Value("${google.client.id}")
private String CLIENT_ID;
@Value("${google.client.pw}")
private String CLIENT_PW;
//@Value("${google.redirect.uri}")
private String CALLBACK_URL = "http://localhost:8089/test_google_oauth2callback";
@Value("${google.endpoint.token}")
private String ENDPOINT_URL_TOKEN;
@Value("${google.endpoint.userinfo}")
private String ENDPOINT_URL_USERINFO;
@RequestMapping(value="/test_google_loginForm")
public String loginForm(Model model){
String loginFormUrl = LOGIN_FORM_URL
+ "?client_id=" + CLIENT_ID
+ "&redirect_uri=" + CALLBACK_URL
+ "&response_type=code"
+ "&scope=email%20profile%20openid"
+ "&access_type=offline";
return "redirect:" + loginFormUrl;
}
}
GET https://accounts.google.com/o/oauth2/v2/auth
client_id
redirect_uri
redirect_uri_mismatch
오류가 발생합니다.response_type
code
로 결정합니다.scope
access_type
@RequestMapping(value="/test_google_oauth2callback", method=RequestMethod.GET)
public void loginGoogle(@RequestParam("code") String code){
System.out.println("authCode = " + code);
}
redirect_uri
로 데이터를 전달해줍니다.code
를 통해 accessToken / refreshToken 획득@RequestMapping(value="/test_google_oauth2callback", method=RequestMethod.GET)
public void loginGoogle(@RequestParam("code") String code){
System.out.println("authCode = " + code);
GoogleRequestVO googleRequestVO = GoogleRequestVO.builder()
.code(authCode)
.clientId(CLIENT_ID)
.clientSecrety(CLIENT_PW)
.grantType("authorization_code")
.redirectUri(CALLBACK_URL).build();
RestTemplate restTemplate = new RestTemplate(); // @Autowired로 받아와도 됨
ResponseEntity<GoogleResponseVO> tokenResponse =
restTemplate.postForEntity(ENDPOINT_URL_TOKEN, googleRequestVO,GoogleResponseVO.class);
}
```java
// 코드를 활용해 token을 받아오는데 사용하는 GoogleRequestVO.class
@Data
@Builder
public class GoogleRequest {
private String clientId;
private String redirectUri;
private String clientSecret;
private String responseType;
private String scope;
private String code;
private String accessType;
private String grantType;
private String state;
private String includeGrantedScopes;
private String loginHint;
private String prompt;
}
// GoogleResponse.class => Code를 통해 Token을 받아오는데 사용하는 VO
@Data
@NoArgsConstructor
public class GoogleResponse {
private String accessToken; // 애플리케이션이 Google API 요청을 승인하기 위해 보내는 토큰
private String expiresIn; // Access Token의 남은 수명
private String refreshToken; // 새 액세스 토큰을 얻는 데 사용할 수 있는 토큰
private String scope;
private String tokenType; // 반환된 토큰 유형 (Bearer)
private String idToken;
}
@Data
@NoArgsConstructor
public class GoogleUserInfoResponse {
private String iss;
private String azp;
private String aud;
private String sub;
private String email;
private String email_verified;
private String at_hash;
private String name;
private String picture;
private String given_name;
private String family_name;
private String locale;
private String iat;
private String exp;
private String alg;
private String kid;
private String typ;
}
// CallTest.java
ResponseEntity<GoogleUserInfoResponse> googleUserInfoResponse
= restTemplate.postForEntity("https://oauth2.googleapis.com/tokeninfo", map, GoogleUserInfoResponse.class);
String email = googleUserInfoResponse.getBody().getEmail();
return email;