다른 서비스 호출
API 제공 서버를 만들었으니 API를 사용하는 서비스도 만들어 보자.
이 서비스는 다른 서버에게 요청을 보내므로 클라이언트 역할을 한다. API 제공자가 아닌 API 사용자의 입장에서 진행하는 것이며, NodeBird 앱의 데이터를 가져오고 싶어 하는 사용자인 것이다.
{
"name": "nodecat",
"version": "1.0.0",
"description": "노드버드 2차 서비스",
"main": "app.js",
"scripts": {
"start": "nodemon app",
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "hvvan",
"license": "ISC",
"dependencies": {
"axios": "^0.19.2",
"cookie-parser": "^1.4.5",
"dotenv": "^8.2.0",
"express": "^4.17.1",
"express-session": "^1.17.1",
"morgan": "^1.10.0",
"nunjucks": "^3.2.1"
},
"devDependencies": {
"nodemon": "^2.0.3"
}
}
nodecat/package.js
nodebird에서 API를 통해 데이터를 가져오는 프로젝트이다.
const express = require('express');
const morgan = require('morgan');
const cookieParser = require('cookie-parser');
const session = require('express-session');
const nunjucks = require('nunjucks');
const dotenv = require('dotenv');
dotenv.config();
const indexRouter = require('./routes');
const app = express();
app.set('port', process.env.PORT || 4000);
app.set('view engine', 'html');
nunjucks.configure('views', {
express: app,
watch: true,
});
app.use(morgan('dev'));
app.use(cookieParser(process.env.COOKIE_SECRET));
app.use(session({
resave: false,
saveUninitialized: false,
secret: process.env.COOKIE_SECRET,
cookie:{
httpOnly: true,
secure: false,
},
}));
app.use('/', indexRouter);
app.use((req, res, next) => {
const error = new Error(`${req.method} ${req.url} 라우터가 없습니다. `);
error.status = 404;
next(error);
});
app.use((err, req, res, next) => {
res.locals.message = err.message;
res.locals.error = process.env.NODE_ENV !== 'production' ? err : {};
res.status(err.status || 500);
res.render('error');
});
app.listen(app.get('port'), () => {
console.log(app.get('port'), '번 포트에서 대기중...');
});
nodecat/app.js
error.html과 .env를 다음과 같이 구현하자
<h1>{{ message }}</h1>
<h2>{{ error.status }}</h2>
<pre>{{ error.stack }}</pre>
nodecat/views/error.html
COOKIE_SECRET=nodecat
CLIENT_SECRET=ffd64ab3-930b-47a1-a92c-bbc4c2b9d8c9
nodecat/.env
CLIENT_SECRET은 이전에 발급받은 도메인 key이다.
그리고 이제 router를 구현하자.
const express = require('express');
const axios = require('axios');
const router = express.Router();
router.get('/test', async (req, res, next) => { //토큰 테스트 라우터
try{
if(!req.session.jwt){
const tokenResult = await axios.post('http://localhost:8002/v1/token', {
clientSecret: process.env.CLIENT_SECRET,
});
if(tokenResult.data && tokenResult.data.code === 200){ //토큰 발급 성공
req.session.jwt = tokenResult.data.token; // 토큰 저장
}else{//토큰 발급 실패
return res.json(tokenResult.data);
}
}
//토큰 테스트
const result = await axios.get('http://localhost:8002/v1/text', {
headers: {authorization: req.session.jwt},
});
return res.json(result.data);
}catch(err){
console.error(err);
if(err.response.status === 419){// 토큰 만료 시
return res.json(err.response.data);
}
return next(err);
}
});
module.exports = router;
nodecat/routes/index.js
GET /test 라우터는 NodeCat 서비스가 토큰 인증 과정을 테스트해보는 라우터이다.
요청이 왔을 때 세션에 발급받을 토큰이 저장되어 있지 않다면 POST http://localhost:8002/v1/token 라우터로 토큰을 발급받아 보관한다.
발급에 성공하면 토큰을 테스트하게 된다.
서버를 동작시켜 보자. api서버도 다른 콘솔로 동작시켜야 한다.
유효기간이 1분이라 1분이 지나면 토큰은 만료된다.
다음 포스트에서 처리해보자.