CMD> express -e exam_back
CMD> cd exam_back
CMD> npm install
CMD> npm i --save mongoose
CMD> npm i --save mongoose-sequence
CMD> npm i --save jsonwebtoken
CMD> nodemon --inspect ./bin/www
// npm i mongoose --save
var mongoose = require('mongoose');
mongoose.connect('mongodb://id201:pw201@1.234.5.158:37017/db201');
var db = mongoose.connection;
db.once('open', function() {
console.log('mongodb 연결됨');
});
// 라우터 연결
var memberRouter = require('./routes/member');
app.use('/member', memberRouter);
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var memberSchema = new Schema({
_id : {type : String, default : ''},
password : {type : String, default : ''},
name : {type : String, default : ''},
email : {type : String, default : ''},
age : {type : Number, default : 0},
regdate : {type : Date, default : Date.now}
});
module.exports = mongoose.model('member_exam', memberSchema);
const jwt = require('jsonwebtoken');
const self = module.exports = {
securityKEY : 'aro9515',
options : {
algorithm : 'HS256',
expiresIn : '30m',
issuer : 'ds',
},
checkToken : async(req,res,next) => {
try {
const token = req.headers.token;
if (token === null) {
return res.send({status:0, result:'토큰없음'});
}
const sessionData = jwt.verify(token, self.securityKEY);
if (typeof sessionData.USERID === 'undefined') {
return res.send({status:0,result:'토큰복원실패'})
}
if (typeof sessionData.USERNAME === 'undefined') {
return res.send({status:0,result:'토큰복원실패'})
}
req.body.USERID = sessionData.USERID;
req.body.USERNAME = sessionData.USERNAME;
next();
} catch (e) {
console.error(e);
if(e.message === 'invalid signature') {
return res.send({status:-1,result:'토큰인증실패'})
}
if(e.message === 'jwp expired') {
return res.send({status:-1,result:'토큰시간만료'})
}
if(e.message === 'invalid token') {
return res.send({status:-1,result:'유효하지않은토큰'})
}
return res.send({status:-1,result:'유효하지않은토큰'})
}
}
}
var express = require('express');
var router = express.Router();
// hash 모듈
const crypto = require('crypto');
// Schema
var Member = require('../models/member');
// 토큰 사용
var jwt = require('jsonwebtoken');
var auth = require('../token/auth');
// 회원가입 POST => 127.0.0.1:3000/member/join
// 로그인 POST => 127.0.0.1:3000/member/login
// 한명조회 GET => 127.0.0.1:3000/member/selectone
// 정보수정 PUT => 127.0.0.1:3000/member/update
// 회원탈퇴 DELETE => 127.0.0.1:3000/member/delete
/////////////////////////////////////////////////////
// 회원가입 POST => 127.0.0.1:3000/member/join
// body : {"id":"aa", "pw":"aa", "name":"aa", "email":"a@a.com","age":36}
router.post('/join', 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.password = hashPw;
member.name = req.body.name;
member.email = req.body.email;
member.age = Number(req.body.age);
const result = await member.save();
// console.log('/join/result ===> ',result);
if (result._id === req.body.id) {
return res.send({status:200});
}
return res.send({status:0});
} catch (e) {
console.error(e);
return res.send({status:-1});
}
});
// 로그인 POST => 127.0.0.1:3000/member/login
// body : {"id":"aa", "pw":"aa"}
router.post('/login', async function(req, res, next) {
try {
const hashPw = crypto.createHmac('sha256', req.body.id).update(req.body.pw).digest('hex');
const result = await Member.findOne({$and : [{_id : req.body.id, password : hashPw}]});
// const query = {$and : [{_id : req.body.id, password : hashPw}]};
// const result = await Member.findOne(query);
// console.log('/login/result ===> ',result);
if (result !== null) {
// 로그인 성공시점 => 토큰 발행
const sessionData = {
USERID : result._id,
USERNAME : result.name
};
const token = jwt.sign(sessionData,auth.securityKEY, auth.options);
return res.send({status:200, token:token});
}
return res.send({status:0});
} catch (e) {
console.error(e);
return res.send({status:-1});
}
});
// 한명조회 GET => 127.0.0.1:3000/member/selectone
router.get('/selectone', auth.checkToken, async function(req, res, next) {
try {
const tokenID = req.body.USERID;
// console.log('/selectone/tokenID ===> ', tokenID);
const result = await Member.findOne({_id : tokenID}).select({_id : 1, name : 1, age : 1});
// console.log('/selectone/result ===> ',result);
if (result !== null) {
return res.send({status:200, result:result});
}
return res.send({status:0});
} catch (e) {
console.error(e);
return res.send({status:-1});
}
});
// 정보수정 PUT => 127.0.0.1:3000/member/update
// body : { "name":"update", "age":1234 }
router.put('/update', auth.checkToken, async function(req, res, next) {
try {
const tokenID = req.body.USERID;
const member = await Member.findOne({_id : tokenID}).select({password:0});
// console.log('/update/member ===> ',member);
member.name = req.body.name;
member.age = req.body.age;
const result = await member.save();
// console.log('/update/result ===> ',result);
if (result.name === req.body.name && result.age === req.body.age) {
return res.send({status:200});
}
return res.send({status:0});
} catch (e) {
console.error(e);
return res.send({status:-1});
}
});
// 회원탈퇴 DELETE => 127.0.0.1:3000/member/delete
// body : { "pw":"aa" }
router.delete('/delete', auth.checkToken, async function(req, res, next) {
try {
const tokenID = req.body.USERID;
const hashPw = crypto.createHmac('sha256', tokenID).update(req.body.pw).digest('hex');
// console.log('/delete/tokenID ===> ', tokenID);
// console.log('/delete/hashPw ===> ',hashPw);
const result = await Member.deleteOne({_id:tokenID, password:hashPw});
// console.log('/delete/result ===> ',result);
if (result.deletedCount === 1) {
return res.send({status:200});
}
return res.send({status:0});
} catch (e) {
console.error(e);
return res.send({status:-1});
}
});
router.get('/', async function(req, res, next) {
try {
return res.send({status:200});
} catch (e) {
console.error(e);
return res.send({status:-1});
}
});
module.exports = router;