토큰 발행

김형우·2022년 3월 2일
0

node.js_part2

목록 보기
4/4

토큰발행 모듈 설치
CMD> npm i jsonwebtoken --save

서버구동
CMD> nodemon --inspect ./bin/www


회원가입

routes/member.js

salt값을 고유한 값으로 사용하면 같은 암호화도 다르게 해쉬가 이루어 질 것이다.
const hashPassword = crypto.createHmac('sha256', req.body.email).update(req.body.password).digest('hex');
그래서 salt값에 email(고유값)을 넣는다.

// 회원가입
// localhost:3000/member/insert
// 이메일(PK), 암호, 이름, 등록일(자동생성)
router.post('/insert', async function(req, res, next) {
    try {

        const hashPassword = crypto.createHmac('sha256', req.body.email)
            .update(req.body.password).digest('hex');
            

        // console.log(req);
        // console.log(req.body);

        const obj = {
            _id     : req.body.email,
            // pw      : req.body.password,
            pw      : hashPassword,
            name    : req.body.name,
            regdate : new Date()
        }

        // 1. DB접속
        const dbconn = await db.connect(dburl);
        // 2. DB선택 및 컬렉션 선택
        const collection = dbconn.db(dbname).collection('member1');

        // 3. 회원추가
        const result = await collection.insertOne(obj);
        
        // 4. 결과확인
        console.log(result);
        // CMD> { acknowledged: true, insertedId: 'a@a.com' }
        
        if(result.insertedId === req.body.email){
            return res.send({status:200});
        }
        
        return res.send({status:0});
        
    } 
    
    catch (e) {
        console.error(e);
        res.send({status:999});
    }
    
});

로그인

config/auth.js
token 사용 정의

module.exports = {
    securityKey : 'ewasgf4ydagf',
    options : {
        algorithm : 'HS256', // 알고리즘
        expiresIn : '10h',   // 만료시간
        issuer    : 'DS'     // 발행자
    },
}

member.js

// 로그인 POST
// localhost:3000/member/select
// 이메일, 암호 => 현시점에 생성된 토큰을 전송
router.post('/select', async function(req, res, next) {
    try {
        // 1. 전송값 받기
        const email = req.body.email;
        const pw = req.body.password;

        // 2. 암호는 바로 비교불가, 회원가입과 동일한 hash후 비교
        const hashPassword = crypto.createHmac('sha256', email)
            .update(pw).digest('hex');

        // 3. 회원정보가 일치하면 토큰 발행
        // DB접속, DB선택 및 컬렉션 선택
        const dbconn = await db.connect(dburl);        
        const collection = dbconn.db(dbname).collection('member1');        
        // 이메일과 hash한 암호가 둘다(AND) 일치
        const result = await collection.findOne({
            _id : email, pw : hashPassword
        });

        if(result !== null) { // 로그인 가능
            const token = jwt.sign(
                { uid : email, uname : result.name }, // 토큰에 포함할 내용들
                jwtKey,          // 토큰생성시 키값
                jwtOptions       // 토큰생성 옵션
            );
            return res.send({status:200, token:token});
        }
        
        return res.send({status:0});
    } 
    catch (e) {
        console.error(e);
        res.send({status:-1, message : e});
    }

});
profile
The best

0개의 댓글