토큰발행 모듈 설치
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});
}
});