app.js 파일 생성
- 소스 코드는 https:.//github.com/zerocho/nodejs-book/ch10/10.4/nodecat
- views/error.html는 nodebird-api로부터 복사
- 아까 발급받은 비밀키를 .env에 입력
views/error.html
<h1>{{message}}</h1>
<h2>{{error.status}}</h2>
<pre>{{error.stack}}</pre>
routes/index.js 생성
- GET /test에 접근 시 세션 검사
- 세션에 토큰이 저장되어 있지 않으면 POST http://localhost:8002/v1/token 라우터로부터 토큰 발급
- 이 때 HTTP 요청 본문에 클라이언트 비밀키 동봉
- 발급에 성공했다면 발급받은 토큰으로 다시 GET https://localhost:8002/v1/test 라우터 접근해서 토큰 테스트
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/test', {
headers: { authorization: req.session.jwt },
});
return res.json(result.data);
} catch (error) {
console.error(error);
if (error.response.status === 419) { // 토큰 만료 시
return res.json(error.response.data);
}
return next(error);
}
});
module.exports = router;
npm start로 서버 시작
- 1분을 기다린 후 다시 접속하면 토큰이 만료되었다는 메시지 뜸
API 서버에 넣어줄 코드
routes/v1.js
const express = require('express');
const jwt = require('jsonwebtoken');
const { verifyToken } = require('./middlewares');
const { Domain, User } = require('../models');
const router = express.Router();
router.post('/token', async (req, res) => {
const { clientSecret } = req.body;
try {
const domain = await Domain.findOne({
where: { clientSecret },
include: {
model: User,
attribute: ['nick', 'id'],
},
});
if (!domain) {
return res.status(401).json({
code: 401,
message: '등록되지 않은 도메인입니다. 먼저 도메인을 등록하세요',
});
}
const token = jwt.sign({
id: domain.User.id,
nick: domain.User.nick,
}, process.env.JWT_SECRET, {
expiresIn: '1m', // 1분
issuer: 'nodebird',
});
return res.json({
code: 200,
message: '토큰이 발급되었습니다',
token,
});
} catch (error) {
console.error(error);
return res.status(500).json({
code: 500,
message: '서버 에러',
});
}
});
router.get('/test', verifyToken, (req, res) => {
res.json(req.decoded);
});
module.exports = router;
'Node.js' 카테고리의 다른 글
CORS 에러 이해하기 (0) | 2021.01.11 |
---|---|
API 서버에서 사용량 제한하기 (0) | 2021.01.11 |
Node에서 API 서버 만들기 (0) | 2021.01.08 |
multer 사용해서 이미지 업로드 구현 (0) | 2021.01.06 |
카카오 로그인 작업 (0) | 2021.01.06 |