토큰 발행
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;