login route
// 로그인
app.post('/login', (req, res) => {
// 요청된 이메일을 데이터베이스에 있는지 찾기
// 요청된 이메일이 데이터베이스에 있다면 비밀번호 확인
// 비밀번호가 맞다면 Token 생성
})
1. 요청된 이메일이 데이터베이스에 존재하는지 확인
// 요청된 이메일을 데이터베이스에 있는지 찾기
User.findOne({ email: req.body.email }, (err, user) => {
if(!user) {
return res.json({
loginSuccess: false,
message: "이메일이 존재하지 않습니다."
})
}
});
2. 요청된 이메일이 데이터베이스에 있다면 비밀번호 확인
// User.js
userSchema.methods.comparePassword = function(plainPassword, cb) {
// plainPassword를 암호화해서 비교
bcrypt.compare(plainPassword, this.password, function(err, isMatch) {
if(err) return cb(err);
cb(null, isMatch)
})
}
// 요청된 이메일이 데이터베이스에 있다면 비밀번호 확인
user.comparePassword(req.body.password, (err, isMatch) => {
if(!isMatch)
return res.json({
loginSuccess: false,
message: "비밀번호가 틀렸습니다."
});
});
3. 비밀번호까지 맞다면 토큰 생성
- JSONWEBTOKEN 라이브러리 다운로드
npm install jsonwebtoken
https://www.npmjs.com/package/jsonwebtoken
jsonwebtoken
JSON Web Token implementation (symmetric and asymmetric). Latest version: 8.5.1, last published: 3 years ago. Start using jsonwebtoken in your project by running `npm i jsonwebtoken`. There are 20132 other projects in the npm registry using jsonwebtoken.
www.npmjs.com
- Token 저장 -> 쿠키
npm install cookie-parser
// User.js
const jwt = require('jsonwebtoken');
...
userSchema.methods.generateToken = function(cb) {
const user = this;
// jsonwebtoken을 이용하여 토큰 생성하기
const token = jwt.sign(user._id.toHexString(), 'secretToken')
// user._id + 'secretToken' = token
user.token = token;
user.save(function(err, user) {
if(err) return cb(err)
cb(null, user);
})
}
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: "비밀번호가 틀렸습니다."
});
// 비밀번호가 맞다면 Token 생성
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 });
})// end generateToken
})// end comparePassword
})// end findOne
})// end /login
'개발 > JavaScript' 카테고리의 다른 글
| [TypeScript] Types (0) | 2022.08.04 |
|---|---|
| [Node.js] Auth route, Logout Route (0) | 2022.07.22 |
| [Node.js] 정보보호, Bcrypt (0) | 2022.07.21 |
| [Node.js] npm, express, mongoDB, 라이브러리 (0) | 2022.07.21 |
| [바닐라 JS] PaintJS - Fill, Save (0) | 2022.04.04 |