본문 바로가기

개발/JavaScript

[Node.js] login route

 

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