통합구현 2022/03/14(token.auth, routes.member)

무간·2022년 3월 14일

토큰 발행

CMD> npm i jsonwebtoken --save

CMD> nodemon --inspect ./bin/www


파일명 token/auth.js

const { verify } = require('jsonwebtoken');
const jwt = require('jsonwebtoken');

// module.exports = {} // module.exports해야 외부에서 사용 가능
const self = module.exports={
    // 토큰 발행 salt 값
    securityKEY : 'fdajskl;aewiopb901324bn',

    // 토큰 발행에 필요한 옵션들..
    options : {
        algorithm : 'HS256',
        expiresIn : '10h', // 10시간
        issuer    : 'ds',        
    },

    // 프런트엔드에서 오는 토큰 검증 부분
    checkToken : async(req,res,next) => {
        try {
            const token = req.headers.auth; // 키는 auth
            if(token === null){
                return res.send({status : 0, resutl:'토큰없음'});
            }
            // 발행시 sign <=> verify 검증시            
            // 발행된 토큰, 보안키
            const sessionData = jwt.verify(token, self.securityKEY);
            
            // USERID, USERNAME키가 존재하는지 확인 
            if(typeof sessionData.USERID === 'undefind'){
                return res.send({status : 0, resutl:'토큰복원실패'});
            }

            if(typeof sessionData.USERNAME === 'undefind'){
                return res.send({status : 0, resutl:'토큰복원실패'});
            }

            // routes/member.js 에서 사용 가능 하도록 정보전달
            req.body.USERID = sessionData.USERID;
            req.body.USERNAME = sessionData.USERNAME;

            next(); // routes/member.js 로 전환

        } 
        catch (e) {
            console.error(e.message);
            if(e.message === 'invalid signature'){
                return res.send({status : 0, resutl:'인정실패'});
            }
            else if(e.message === 'jwt expired'){
                return res.send({status : 0, resutl:'시간만료'});
            }
            else if(e.message === 'invalid token'){
                return res.send({status : 0, resutl:'유효하지 않는 토큰'});
            }
            return res.send({status : 0, resutl:'유효하지 않는 토큰'});
        }
    }
}

파일명 routes.member.js

var express = require('express');
var router = express.Router();

// 문자를 HASH하기
// a => avosdiurjt092kio9a0s
const crypto = require('crypto');

// 토큰 발행
const jwt = require('jsonwebtoken');
const auth = require('../token/auth');

// member 스키마 가져오기
var Member = require('../models/member');


// 로그인 : 회원정보 수정
// 토큰, 이름과 나이변경
// 127.0.0.1:3000/member/update
router.put('/update', auth.checkToken, async function(req, res, next){
    try {
        const sessionID = req.body.USERID; // 토큰에서 추출
        const name      = req.body.name;   // 전달된 값
        const age       = req.body.age;    // 전달된 값

        // 아이디에 해당하는 값을 조회 후 변경할 항목 2개 변경
        var Member1 = await Member.findOne({_id : sessionID});
        Member1.name = name;
        Member1.age = age;

        const result = await Member1.save();
        console.log(result);
        if(result._id != ''){
            return res.send({status:200});            
        }
        return res.send({status:0});

    } catch (e) {
        console.error(e);
        return res.send({status:-1});
    }
})

// 로그인 : 암호변경
// 127.0.0.1:3000/member/updatepw
// {"pw":"aaa" , "newpw":"aaaa"}
router.put('/updatepw', auth.checkToken, async function(req, res, next){
    try{
        const sessionID = req.body.USERID; // 토큰에서 추출        
        
        // findOne으로 로그인 한 후 변경하기
        const hashPw = crypto.createHmac('sha256', sessionID).update(req.body.pw).digest('hex');
        const query = {_id : sessionID, password : hashPw};
        var Member1 = await Member.findOne(query);     

        const hashPw1 = crypto.createHmac('sha256', sessionID).update(req.body.newpw).digest('hex');
        Member1.password = hashPw1;

        const result = await Member1.save();

        if(result._id != ''){
            return res.send({status:200});
        }
        return res.send({status:0});
    }
    catch (e) {
        console.error(e);
        return res.json({status:-1});
    }
})


// 로그인 : 회원탈퇴
// 127.0.0.1:3000/member/delete
router.delete('/delete', auth.checkToken, async function(req, res, next){
    try {
        const sessionID = req.body.USERID; // 토큰에서 추출
        const result = await Member.deleteOne({_id : sessionID});
        console.log(result);        
        if(result.deletedCount === 1){
            return res.json({status:200});
        }
        return res.json({status:0});
    } catch (e) {
        console.error(e);
        return res.json({status:-1});
    }
    
})



// 로그인
// 127.0.0.1:3000/member/select
// {"id":"aaa","pw":"aaa"}
router.post('/select', async function(req, res, next){
    try {
        // get  => req.query
        // post => req.body
        const hashPw = crypto.createHmac('sha256', req.body.id).update(req.body.pw).digest('hex');

        // DB연동 키 ( _id, password)
        const query = {$and : [{_id : req.body.id, password : hashPw}]};
        const result = await Member.findOne(query);
        console.log(result);
        if(result !== null){ // 성공
            // 세션에 정보를 추가함.
            // 같은 서버가 아니기때문에 세션을 확인할 방법 없음.
            // 토큰(출입할 수 있는 키)을 발행
            
            // 세션에 추가할 값, 보안키, 옵션
            const sessionData = {
                USERID : result._id, 
                USERNAME : result.name
            };
            const token = jwt.sign( sessionData, auth.securityKEY, auth.options );

            return res.json({status:200, result:token});
        }
        // 실패
        return res.json({status:0});        
    } catch (e) {
        console.error(e);
        res.json({status:-1});
    }
});


// 127.0.0.1:3000/member/idcheck?id=a
router.get('/idcheck', async function(req, res, next){
    try {
        const result = await Member.findOne({_id : req.query._id});
        console.log(result);
        if(result !== null){
            return res.send({status:200, result:1});            
        }
        return res.send({status:200, result:0});

    } catch (e) {
        console.error(e);
        return res.send({status:-1});
    }
})

// 회원가입
// 127.0.0.1:3000/member/insert
// {"id":"aaa", "name":"aaa", "pw":"aaa", "email":"aaa@gmail.com", "age":30}
router.post('/insert', async function(req, res, next) {
    try {
        
        const hashPw = crypto.createHmac('sha256', req.body.id).update(req.body.pw).digest('hex');

        var member = new Member();
        member._id = req.body.id;  // member['id] = req.body.id;
        member.name = req.body.name;
        member.password = hashPw;
        member.email = req.body.email;
        member.age = Number(req.body.age);

        const result = await member.save();
        console.log("result=====",result);
        if(result._id !== null){
            return res.json({status:200});
        }
        return res.json({status:0});       
        
    } catch (e) {
        console.error(e);
        return res.json({status:-1});
    }
});

// 127.0.0.1:3000/member/select
router.get('/select', async function(req, res, next){
    try {
        const result = await Member.find({});
        return res.json({status:200, result:result});
        
    } catch (e) {
        console.error(e);
        return res.json({status:-1});
    }
});

module.exports = router;
profile
당신을 한 줄로 소개해보세요

0개의 댓글