로그인 검증(JWT)
유저가 로그인 이후에 발급받은 토큰을 이제 앱에서 검증된 사용자인지 아닌지 판단을 해야할 때가 있습니다. 예를 들면 로그인 이후 만들어진 API를 사용하기 위해서 로그인을 한 유저인지 검증해야합니다. 검증만 간단히 하는 테스트를 작성하였고 이후에는 여러가지 기능들을 사용하기 전에 이 검증 미들웨어를 사용하게 될 것 입니다.
소스코드
controllers/usercontroller.js
const User = require('../models/usermodel');
exports.insertUserProcess = (req,res) => {
let item={
'id':req.body.id,
'username':req.body.username,
'password':req.body.password,
'email':req.body.email
};
User.insertData(item,(result)=>{
if(result){
if(result.affectedRows===1){
res.status(201).send({
message:'create ID success!'
});
}
else{
res.status(409).send({
message:'signup failed! because duplicate error, use a different ID'
});
}
}
})
}
exports.loginProcess = (req,res) => {
let item={
'id':req.body.id,
'password':req.body.password
};
User.checkUser(item,(result)=>{
if(result===0){
res.status(404).send({
message:'No matching id, please check your id'
});
}
else if(result===1){
res.stauts(401).send({
message:'compare server error'
});
}
else if(result===2){
User.tokenIssue(item,(token)=>{
res.status(201).send({
message:'success',
token
});
});
}
else if(result===3){
res.status(401).send({
message:'password error'
});
}
else{
res.status(401).send({
message:'Server Error'
});
}
});
}
exports.userVerifyTokenTest = (req,res) => {
res.send("success");
}
추가된 함수는 userVerifyTokenTest가 추가되었습니다. 라우터에서 헤더에 토큰을 담아서 미들웨어에서 토큰이 유효한지 검증합니다.
middleware/users.js
const jwt= require('jsonwebtoken');
module.exports = {
validateRegister: (req, res, next) => {
//username min length 3 max length 15
//password min 6chars
if(!req.body.id || req.body.id.length < 3 || req.body.id.length>15){
return res.status(400).send({
message: "input your id or 3~15 write id",
});
}
if(!req.body.username || req.body.username.length < 3 || req.body.username.length>15){
return res.status(400).send({
message: "input your username or 3~15 write username",
});
}
if(!req.body.password || req.body.password.length < 6){
return res.status(400).send({
message: "input your password or 6upper write password",
});
}
if(!req.body.email || req.body.email.length < 1){
return res.status(400).send({
message : "input your email or 1upper email",
});
}
next();
},
verifyToken : (req, res, next) => {
const authHeader = req.headers['authorization'];
const token = authHeader && authHeader.split(" ")[1];
if(token){
jwt.verify(token,'SECRETKEY',(error,user)=>{
if(error){
return res.status(401).send({
message : "token is not Invalid"
});
}
req.user=user;
next();
});
}
else{
res.status(401).send({
message:'no have token'
});
}
}
}
헤더에서 받은 토큰을 저장하여 jwt.verify를 이용하여 토큰을 검증한다.
routes/users.js
const express = require('express');
const router = express.Router();
const controller = require('../controllers/usercontroller');
const {validateRegister,verifyToken} = require('../middleware/users');
router.post('/register',validateRegister,controller.insertUserProcess);
router.get('/login',controller.loginProcess);
router.get('/users',verifyToken,controller.userVerifyTokenTest);
module.exports = router;
'Programming > nodejs' 카테고리의 다른 글
[NodeJs] JWT(Json web Token) 로그인 Restful API 만들기 - 로그인편 (0) | 2022.01.17 |
---|---|
[NodeJs] JWT(Json web Token) 로그인 Restful API 만들기 - 회원가입편 (0) | 2022.01.16 |
[NodeJS] Express의 모든 정리 (0) | 2022.01.14 |
[NodeJS] MySQL 다중 쿼리문 - Multiple Statements (0) | 2021.11.03 |
[NodeJS] 넷폴릭스 크롤링 (0) | 2021.10.03 |