ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • node.js 로 google oauth2 테스트 하기 rest api만 이용
    Programming 2017. 5. 19. 16:19


    google oauth2 node.js 테스트 서버


    google library 를 이용하지 않고 순수하게 rest api만을 가지고 구글 연동을 테스트한다.

    (2017년 5월 테스트 정상적으로 진행됨을 확인하였다.)



    var request = require('request');

    var express = require('express');

    var cookieParser = require('cookie-parser');

    var bodyParser = require('body-parser');

    require('console-stamp')(console, '[yyyy-mm-dd HH:MM:ss.l]');



    var app = express();

    app.set('view engine', 'jade');

    app.use(bodyParser.json());

    app.use(bodyParser.urlencoded({ extended: true }));

    app.use(cookieParser());



    //favicon

    app.get('/favicon.ico', function(req, res) {

        res.status(204);

    });


    var CLIENT_ID = '12345xxxxxx-abcde.apps.googleusercontent.com';

    var CLIENT_SECRET = 'abcdefghijklmnopqrstuvwxyz';

    var REDIRECT_URI = 'http://localhost:12345/oauth2callback';



    var router = express.Router();




    //웹에서 구글 로그인 페이지(로그인테스트용)

    router.get('/get_auth_code', function(req, res){


        var s_html = '<html>';

        s_html += '<head></head>';

        s_html += '<body>';

        s_html += '<a href="https://accounts.google.com/o/oauth2/auth?'+

            'client_id='+CLIENT_ID+

            '&redirect_uri='+REDIRECT_URI+

            '&scope=https://www.googleapis.com/auth/plus.login'+

            '&response_type=code">로그인</a>';

        s_html += "</body>";

        s_html += "</html>";


        res.send(s_html);

    });



    //콜백 테스트용

    router.get('/oauth2callback', function(req,res) {


        if(typeof req.query.code != 'undefined')

        {

            console.log("authorization code = " + req.query.code);

            res.send("authorization code = " + req.query.code);

        }

        else if(typeof req.query.access_token != 'undefined')

        {

            console.log("access_token = " + req.query.access_token);

            res.send("access_token = " + req.query.access_token);

        }

        else if(typeof req.query.user_id != 'undefined')

        {

            console.log("user_id = " + req.query.user_id);

            res.send("user_id = " + req.query.user_id);

        }

    });






    //authorization code -> access_token

    router.get('/redeem', function(req,res) {


        var postVal = "grant_type=authorization_code"+

                "&code="+req.query.code+

                "&client_id="+CLIENT_ID+

                "&client_secret="+CLIENT_SECRET+

                "&redirect_uri="+REDIRECT_URI;


        var requestOption = {

            url : "https://www.googleapis.com/oauth2/v4/token",

            headers: {'content-type' : 'application/x-www-form-urlencoded'},

            method : 'POST',

            body : postVal

        }


        request.post(requestOption, function(err, google_res, body) {


            if (err != null) {

                console.error("error");

                return;

            }


            var res_obj = JSON.parse(google_res.body);

            console.log("received access_token : "+res_obj.access_token);

        });


        res.send("authorization code : " + req.query.code);

    });







    //access_token -> user_uid

    router.get('/get_user_id', function(req,res) {


        postVal = 'access_token='+req.query.access_token;


        var requestOption = {

            url : 'https://www.googleapis.com/oauth2/v1/tokeninfo',

            headers : {'content-type' : 'application/x-www-form-urlencoded'},

            method : 'POST',

            body : postVal

        };


        request(requestOption, function(err, google_res, body) {


            if (err != null) {

                console.dir(err);

                //sendModule.SendResult(res, "F", "AC_GOOGLE_REQ_FAIL", "{}");

                return;

            }


            //var g_res = JSON.parse(google_res.body);


            var res_obj = JSON.parse(google_res.body);

            console.log("user_id : "+res_obj.user_id);

        });


    });




    app.use('/', router);



    app.use(function(req, res, next) {

        res.status(404);

        res.render('error', {

            message: '404 : Invalid page request',

            error: {}

        });

    });



    var port = 12345;

    app.set('port', port);

    var server = app.listen(port, function () {

        console.log('[!] Web service open ... ok : (Port:' + port + ")");

    });



    oauth2 인증의 순서 개요 >


    #1 구글 로그인하여 authorization code를 얻는다

    #2 얻은 authorization code로 access token을 얻는다. 

        (한번만 얻을 수있다. 이후에는 요청시 이미 redeem 했다는 4에러발생)

    #3. access token으로 유저 정보를 얻는다. (user_id 등)






    테스터 사용 방법 > 


    구글 authorization code 얻기 :


    - 서버를 가동한 후 웹브라우저에 http://localhost:12345/get_auth_code 를 입력하고 요청한다.

    - 화면에 로그인 링크를 클릭

    - 구글 로그인을 하면, redirect uri로 이동하게 된다. 

    - node 콘솔에 authorization token이 출력되면 정상.



    authorization code로 access token 얻기 :


    - 상기 authorization code 얻기로 코드를 얻어야 진행 가능하다.

    - 웹브라우저 탭을 하나 더 열고 이번엔 http://localhost:12345/redeem?code=(authorization code)를 입력

    - node 로그 확인



    access token으로 유저 정보 얻기 :


    - 상기 access_token 을 얻어야 진행가능하다.

    - 웹브라우저 탭을 하나 더 열고 이번엔 http://localhost:12345/get_user_id?access_token=(access_token code)를 입력

    - node 로그 확인






    기타 >


    - 구글 API 크레덴셜에서 Client id를 생성할때 Web 애플리케이션으로 발급받아야 

      본 테스트 진행이 가능하다.


    - redirect_uri로만 정보가 전달되는것은 아니고, 요청시의 정보가 바르다면 곧바로 응답을 받을 수 있다. 


    - redirect_uri는 꼭 연결되어야 필요는 없으나, 로그인시 사용했던 uri와 검증시 uri가 동일해야 정보를 얻을 수 있다. 

      (그래서 코드에서는 REDIRECT_URI 로 정의하여 사용하였다.)

       

    - client id등을 지정할 수 는 없지만 그외에 다른 테스트는 https://developers.google.com/oauthplayground 에서
      가능하다.


Designed by Tistory.