- npm install jsonwebtoken --save 설치
- npm install cookie-parser --save 설치
index.js==================================
const bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({extended: true}))
app.use(bodyParser.json())
const cookieParser = require('cookie-parser')
app.use(cookieParser())
app.post('/login', (req, res) => {
User
.findOne({email: req.body.email})
.then((user) => {
if(!user){
return res.json({
loginSuccess: false,
messsage: "제공된 이메일에 해당하는 유저가 없습니다."
})
}
user.comparePassword(req.body.password, (err, isMatch) => {
if(!isMatch) {
return res.json({loginSuccess: false, messsage: "비밀번호가 틀렸습니다."})
}
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})
})
})
})
.catch((err) => {
return res.status(400).send(err)
})
})
models/User.js=====================
const jwt = require('jsonwebtoken')
userSchema.methods.comparePassword = function(plainPassword, cb) {
bcrypt.compare(plainPassword, this.password, function(err, isMatch) {
if(err) return cb(err)
cb(null, isMatch)
})
}
userSchema.methods.generateToken = function(cb) {
var user = this;
var token = jwt.sign(user._id.toHexString(), 'secretToken')
user.token = token
user
.save()
.then((user) => {
cb(null, user)
})
.catch((err) => {
cb(err)
})
}
- modles/User.js에서 userSchema.methods.generateToken 중에 user._id.toHexString()를 그냥 user._id()로 쓰게 되면 Error: Expected "payload" to be a plain object 오류가 남.
따라서 toHexString()를 붙여주면 해결됨.