알쓸전컴(알아두면 쓸모있는 전자 컴퓨터)

google oauth2 사용하기 본문

Web

google oauth2 사용하기

백곳 2019. 3. 22. 23:09

google oauth2 사용하기


구글 공식 문서 기준으로 작성 합니다.


먼저 oauth2 를 사용하기 위해서는


아래와 같이 OAuth 클라이언트 ID 를 만들어야 합니다.






아래 링크 문서 기준으로 사용법을 알아 보겠습니다.


https://developers.google.com/identity/protocols/OAuth2WebServer  (2019.03.22 일짜)


먼저 아래


라이브러리를 지원 한다고 나와 있습니다.


하지만 저는 HTTP/REST 를 사용하겠습니다.


예제로는



위와 같이 4개의 예제가 사용 되지만


HTTP/REST 을 서버 쪽은 JAVA로 해서 이용 하겠습니다.




예제는 위와 같이 나옵니다.


그래서


저는

https://accounts.google.com/o/oauth2/v2/auth?scope=https://www.googleapis.com/auth/analytics.readonly&

access_type=offline&

include_granted_scopes=true&state=state_parameter_passthrough_value&

redirect_uri=http://localhost:8181/thkomeetB/account/googlesigncallback&response_type=code&client_id=711155811271-2f5eetje4gtic3lv2d6tlvmt3ne8fmm2.apps.googleusercontent.com


위와 같이 적용 하고


여기서 잠깐


access_type=offline 의미


사용자가 browser(Chrome 같은) 에 없어도 Refresh Token 을 발급 받을수 있는지 없는지는 설정합니다.

offline 사용자가 browser를 나가도 응용 프로그램에서 Refresh Token을 받아서 쓸수 있습니다.

online 은 그반대 입니다.  서비스를 개발하는데 중요한 설정 사항 입니다.


Scope



여기에 커서를 올리면



위와 같이 Socpe 범위 주소 값이 나옵니다.


openid https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile


위에 3개를 등록 해줘야 사용자의 정보를 같이 얻어올수 있습니다.


저는 이 예제 에서는 사용자 정보를 가져 오지 않고 analytics 정보만 얻어 오기 때문에 추가 하지 않았습니다.


Front End



위에 주소를 링크를 걸어서 실행 시켜 줘야 합니다.


예를 들면 아래와 같이 링크를 걸어 줍니다.


<a href="

https://accounts.google.com/o/oauth2/v2/auth?

scope=https://www.googleapis.com/auth/analytics.readonly&

access_type=offline&

include_granted_scopes=true&state=state_parameter_passthrough_value&

redirect_uri=http://localhost:8181/thkomeetB/account/googlesigncallback&response_type=code&client_id=711155811271-2f5eetje4gtic3lv2d6tlvmt3ne8fmm2.apps.googleusercontent.com

">로그인</a>


그리고 나면



위와같은 페이지가 나오고


로그인을 하면


위와 같은 허가권 팝업이 나옵니다. 허용을 하면



그럼 아래와 같이 redirect url 로 옮겨 갑니다. (아마 Back End 서버에서 Brack Point 걸고 대기타면 해당 URL 로 들어 오는것을 좀더 명확이 체감 할수 있습니다.ㅎㅎ .. )


http://localhost:8181/thkomeetB/account/googlesigncallback?

state=state_parameter_passthrough_value&code=4/FQGw5F6BFjM3DYBlbeybuFSTCxKQ69ocwkpiS9r5Fba2dX0h_AJ5sP7yEqyFvAE-cfBfDysIZlELKN4WTH_HruQ&

scope=https://www.googleapis.com/auth/analytics.readonly


이제 해당 Query url 정보로


BackEnd



에서 access_token  토근을 얻는게 목적이죠,



구글 에서는 아래 사이트에 Post로 보내서 토큰을 가져가라고 합니다.




아래 코드는 Redirect 후 Access_token 을 받아 오는 코드입니다.



@RequestMapping(value = "/account/googlesigncallback", method = RequestMethod.GET)
public void GoogleSignCallback(HttpServletRequest request, HttpServletResponse response) {
try {
accountDaoImpl.GoogleSignCallback(request, response);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}  


    @Override
    public void GoogleSignCallback(HttpServletRequest request, HttpServletResponse response) throws Exception {
        // TODO Auto-generated method stub
        String code = request.getParameter("code");
        HttpHeaders headers = new HttpHeaders();
        RestTemplate restTemplate = new RestTemplate();
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        
        MultiValueMap<String, String> parameters = new LinkedMultiValueMap<>();
        parameters.add("code", code);
        parameters.add("client_id", PreDefined.Google_auth2_client_id);
        parameters.add("client_secret", PreDefined.Google_auth2_client_scret_id);
        parameters.add("redirect_uri", PreDefined.Google_auth2_redirect_uri);
        parameters.add("grant_type", "authorization_code");
        
        HttpEntity<MultiValueMap<String,String>> rest_request = new HttpEntity<>(parameters,headers);
        
        URI uri = URI.create("https://www.googleapis.com/oauth2/v4/token");
        
        ResponseEntity<Map> rest_reponse;
        rest_reponse = restTemplate.postForEntity(uri, rest_request, String.class);
        String bodys = rest_reponse.getBody();
        System.out.println(bodys);

        response.sendRedirect("http://localhost:8080/thkomeet");
        
        return ;
    }
   





그리고 나서


Backend log 을 보면



여기서 Id_token 은 JWT 토큰 입니다.


해당 자료는


https://idlecomputer.tistory.com/240 (Token 인증 개념 JWT (Login 기능을 위한)(2))


보면 자세히 정리 해뒀습니다



위와 같이 추가 된것을 알수 있습니다.


'Web ' 카테고리의 다른 글

방문자 행동 분석 heat map  (0) 2019.03.25
동적 웹 크롤러 (seleniumhq)  (0) 2019.03.23
Google web-login  (0) 2019.03.21
tomcat startup 시 Lock ? Hang ? Slow 현상  (1) 2019.03.07
Spring 에서 @Controller 찾지 못할때  (0) 2019.02.19
Comments