route 안에서 구현 해야할 것
- DB에서 요청받은 이메일 찾기
- DB에 요청받은 이메일이 있다면, DB에 저장된 비밀번호와 요청받은 비밀번호가 같은지 확인
- 비밀번호까지 같다면 Token을 생성
👩🏻💻 Token 생성을 위해서 JSONWEBTOKEN 라이브러리 다운로드
npm install jsonwebtoken --save👩🏻💻 Token 저장을 위해서 Cookie 라이브러리 다운로드
npm install cookie-parser --save
app.post('/api/users/login', async(req, res)=> {
try{
// ⭐1. client로부터 요청된 이메일이 DB에 있는지 확인
const user= await User.findOne({ email: req.body.email })
if(!user){
return res.json({
loginSuccess: false,
message: "요청받은 이메일에 해당하는 유저가 없습니다."
})
}
// ⭐2. 요청된 이메일이 있다면, 비번이 맞는지 확인
// comparePassword 메서드는 usermodel에서 생성
const isMatch= await user.comparePassword(req.body.password);
if(!isMatch){
return res.json({ loginSuccess: false, message: "비밀번호가 틀렸습니다." })
}
// ⭐3. 비번이 맞다면, 토큰 생성
//generateToken 메서드 또한 usermodel에서 생성
const userdata= await user.generateToken();
// client에게 보내줄 res 내용
res
// 'x_auth'라는 이름으로 유저의 Token을 Cookie에 저장
.cookie("x_auth",user.token)
.status(200)
.json({loginSuccess:true, userId: user._id})
} catch(err){
return res.status(400).send(err)
}
})
userSchema.methods.comparePassword = function (plainPassword) {
// client가 보낸 비밀번호 (=plainpassword)와 DB에 암호화된 비밀번호가 같은지 확인
const result = bcrypt.compare(plainPassword, this.password);
return result;
};
userSchema.methods.generateToken = async function (cb) {
var user = this;
// jsonwebtoken을 이용해서 token을 생성
// user._id(DB의 _id) + secreToken = token
// token으로 user를 판별할 수 있다.
var token = jwt.sign(user._id.toHexString(), 'secretToken');
user.token = token;
try {
const savedUser = await user.save();
return user;
} catch (err) {
return err;
}
};
var jwt = require('jsonwebtoken');
var token = jwt.sign({ foo: 'bar' }, 'shhhhh');
body에 이메일과 비밀번호를 넣고 Send 하면 아래에 결과값이 나타난다.
