Node.js 기초(8) - 로그인 기능 구현
[로그인 기능 구현하기]
이번에는 로그인 폼을 전달 받았을 때 DB에 해당 email이 존재하는지, 그리고 Password가 동일한지 확인하고 토큰을 발급하는 작업을 해보겠습니다.
Login 기능 구현하기
목차
Login Route 만들기
우선 index.js에 login route를 만듭니다.
app.post('/login', (req, res) => {
//1. 요청된 이메일을 데이터베이스에 있는지 찾는다.
//2. 요청된 이메일이 데이터베이스에 있다면 비밀번호가 맞는지 확인
//3. 비밀번호가 맞다면 토큰을 생성
})
})
Email과 Password 확인
입력된 이메일이 DB에 존재하는지 먼저 확인합니다.
app.post('/login', (req, res) => {
//1. 요청된 이메일을 데이터베이스에 있는지 찾는다.
User.findOne({ email: req.body.email }, (err, user) =>{
if(!user){
return res.json({
loginSuccess: false,
message: "해당 이메일이 존재하지 않습니다."
})
}
//2. 요청된 이메일이 데이터베이스에 있다면 비밀번호가 맞는지 확인
})
})
})
DB에 존재한다면 Password가 맞는지 확인하는 ‘comparePassword’ 함수를 User.js에서 만듭니다.
userSchema.methods.comparePassword = function(plainPassword, cb){
//plainPassword = 12345678 , 암호화된 비밀번호 = this.password
bcrypt.compare(plainPassword, this.password, function(err, isMatch) {
if(err) return cb(err)
cb(null, isMatch)
})
}
다시 index.js로 와서 수정해줍니다.
app.post('/login', (req, res) => {
//1. 요청된 이메일을 데이터베이스에 있는지 찾는다.
User.findOne({ email: req.body.email }, (err, user) =>{
if(!user){
return res.json({
loginSuccess: false,
message: "해당 이메일이 존재하지 않습니다."
})
}
//2. 요청된 이메일이 데이터베이스에 있다면 비밀번호가 맞는지 확인
user.comparePassword(req.body.password, (err, isMatch) =>{
if(!isMatch)
return res.json({
loginSuccess:false,
message:"비밀번호가 틀렸습니다."
})
})
//3. 비밀번호가 맞다면 토큰을 생성
})
토큰 생성
마지막으로 DB에 이메일이 존재하고 비밀번호까지 같다면 유저를 위한 토큰을 생성합니다.
1) 라이브러리 설치
npm install jsonwebtoken --save
2) generateToken 함수 만들기
User.js에 토큰을 생성하는 generateToken 함수를 구현합니다.
const jwt = require('jsonwebtoken');
userSchema.methods.generateToken = function(cb) {
var user = this;
// jsonwebtoken을 이용해서 토큰 생성하기
var token = jwt.sign(user._id.toHexString(), 'scertToken');
// mongodb에 저장된 user의 id값은 '_id'로 표현
user.token = token;
user.save(function(err, user){
if(err) return cb(err)
cb(null, user)
})
}
user._id + ‘secretToken’ 으로 token을 생성하게 됨.
token을 해석을 할 때 ‘secretToekn’를 넣으면 user._id를 알 수 있음
toHexString()로 하지 않으면 Error: Expected "payload" to be a plain object
라는 에러가 생깁니다.
3) 토큰 저장
발급된 토큰을 로컬스토리지나 쿠키에 저장해야 합니다. 저는 쿠키에 저장하겠습니다.
쿠키에 저장하기 위해서는 cookie-parser를 설치해야합니다.
npm istall cookie-parser --save
마지막으로 index.js를 수정합니다.
const cookieParser = require('cookie-parser');
app.use(cookieParser());
app.post('/login', (req, res) => {
//1. 요청된 이메일을 데이터베이스에 있는지 찾는다.
User.findOne({ email: req.body.email }, (err, user) =>{
if(!user){
return res.json({
loginSuccess: false,
message: "해당 이메일이 존재하지 않습니다."
})
}
//2. 요청된 이메일이 데이터베이스에 있다면 비밀번호가 맞는지 확인
user.comparePassword(req.body.password, (err, isMatch) =>{
if(!isMatch)
return res.json({
loginSuccess:false,
message:"비밀번호가 틀렸습니다."
})
})
//3. 비밀번호가 맞다면 토큰을 생성
user.generateToken((err,user) => {
if(err) return res.status(400).send(err);
// 토큰을 저장한다. 어디에? 쿠키, 로컬스토리지
res.cookie("x_auth", user.token)
.status(200)
.json({loginSuccess: true, userId: user_id})
})
})
Comments