//미리보기⬆️
npm i jsonwebtoken cookie-parser --save
//서버
const express = require("express")
const app = express()
const port = 5000
//디비
const config = require('./config/dev')
const mongoose = require("mongoose")
mongoose
.connect(config.mongoURI, {
useNewUrlParser: true,
useUnifiedTopology: true,
useCreateIndex: true,
useFindAndModify: false
})
.then(()=>console.log('MongoDB Connected...'))
.catch(err=>console.log(err))
app.get('/', (req, res) => res.send('Hello World!눈누난나'))
//회원가입
const { User } = require("./models/User")
const bodyParser = require('body-parser')
app.use(bodyParser.urlencoded({extended: true}))
app.use(bodyParser.json())
app.post('/register', (req, res) => {
const user = new User(req.body);
user.save((err, userInfo) => {
if(err) return res.json({ success: false, err })
return res.status(200).json({ success: true })
})
})
//로그인
const cookieParser = require('cookie-parser')
app.use(cookieParser())
app.post('/login', (req, res) => {
//요청된 이메일을 데이터베이스에서 찾고
User.findOne({ email: req.body.email }, (err, user) => {
if(!user) {
return res.json({
loginSuccess: false,
message: "요청된 이메일에 해당하는 유저가 없습니다."
})
}
//비밀번호가 맞는지 확인 후
user.comparePassword(req.body.password, (err, isMatch) => {
if(!isMatch)
return res.json({ loginSuccess: false, message: "비밀번호가 틀렸습니다"})
//생성된 토큰을 쿠키에 저장
user.generateToken((err, user) => {
if(err) return res.status(400).send(err);
res.cookie("x_auth", user.token)
.status(200)
.json({ loginSuccess: true, useId: user._id })
})
})
})
})
app.listen(port, () => console.log(`Example app listening on port ${port}!`))
const mongoose = require('mongoose');
const bcrypt = require('bcrypt')
const saltRounds = 10
const jwt = require('jsonwebtoken')
const userSchema = mongoose.Schema({
name: {
type: String,
maxlength: 100
},
email: {
type: String,
trim: true,
unique: 1
},
password: {
type: String,
minlength: 10
},
role: {
type: Number,
default: 0
},
image: String,
token: {
type: String
},
tokenExp: {
type: Number
}
})
//회원가입 시 저장전에 디비에 저장될 비밀번호 암호화
userSchema.pre('save', function(next){
var user = this;
if(user.isModified('password')) {
bcrypt.genSalt(saltRounds, function(err, salt) {
if(err) return next(err)
bcrypt.hash(user.password, salt, function(err, hash) {
if(err) return next(err)
user.password = hash
next()
})
})
} else {
next()
}
})
//로그인 시 비밀번호를 암호화해서 디비에 저장된 비밀번호와 비교
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(function(err, user) {
if(err) return cb(err)
cb(null, user)
})
}
const User = mongoose.model('User', userSchema)
module.exports = {User}