본문으로 바로가기
로그인 검증(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;