-
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 에서가능하다.'Programming' 카테고리의 다른 글
git submodule 파일 받아지지 않을때 (0) 2020.03.30 vscode 상단 타이틀 바에 경로 표시하기 (0) 2018.08.14 node.js, let's encrypt로 https 지원하기 (0) 2017.12.14 node.js mysql DATETIME 얻어올때 포맷 변경되는 현상 해결 (0) 2017.11.07 pebble2 javascript 개발환경 구축 (0) 2017.08.07