Node & React basic #7

Jay·2023년 5월 11일
0

Node & React basic

목록 보기
7/21
post-thumbnail

이제 로그인을 해보자.

로그인을 하려면 확인할 것이 있는데
1. 로그인 요청된 이메일이 데이터베이스에 존재하는지 찾아본다.
2. 이메일이 있다면 비밀번호가 일치하는지 확인한다.
3. 비밀번호까지 맞다면 토큰을 생성한다.

그럼 User에서 post를 해보도록 하자.

역시나 콜백 함수는 사용할 수 없기 때문에 .then.catch를 이용하자.

요청된 이메일을 찾아보기

app.post("/login", (req, res) => {
  // 요청된 이메일을 데이터베이스에서 찾아본다.
  User.findOne({ email: req.body.email }).then(user => {
    if (!user) {
      return res.json({
        loginSuccess: false,
        message: "해당 이메일에 일치하는 유저가 없습니다.",
      });
    }
    // 요청한 이메일이 있다면 비밀번호가 맞는지 확인한다.

  })
    

  // 비밀번호까지 맞다면 토큰을 생성한다.
});

강의에서는

app.post('/login', (req, res) => {
	User.findOne({email: req.body.email}, (err, user) => {
    	if(!user) {
        	...
        }
    }
})

이런 식으로 콜백으로 처리했음.

비밀번호를 확인하기

app.post("/login", (req, res) => {
  // 요청된 이메일을 데이터베이스에서 찾아본다.
  User.findOne({ email: req.body.email }).then(user => {
    if (!user) {
      return res.json({
        loginSuccess: false,
        message: "해당 이메일에 일치하는 유저가 없습니다.",
      });
    }
    // 요청한 이메일이 있다면 비밀번호가 맞는지 확인한다.
	user.comparePassword({req.body.password, (err, isMatch) => 
  		...
  	})
  })
    

  // 비밀번호까지 맞다면 토큰을 생성한다.
});

comparePassword 메서드를 model에서 만들자.

userSchema.methods.comparePassword = function (plainPassword, cb) {
  // plainPassword 1234567, 암호화된 비밀번호 서로 확인
  bcrypt.compare(plainPassword, this.password, function (err, isMatch) {
    if (err) return cb(err);
    cb(null, isMatch);
  });
};

bcrypt를 이용해서 plainPassword와 암호화되어 저장된 password를 비교한다.
만약 isMatch가 false이면(같지 않으면) err을 callback한다.
그리고 문제가 발생할 게 없으면 cb는 null을 보내주고 isMatch를 보내주는데 이때 isMatch는 true가 되겠지

이렇게 만든 메서드는 index.js의

요 부분에서 사용되는 것이다.

그러면 index.js에서 이 결과를 받아서 어떻게 쓸지를 적어주자.

app.post("/login", (req, res) => {
  // 요청된 이메일을 데이터베이스에서 찾아본다.
  User.findOne({ email: req.body.email }).then(user => {
    	...
  		});
    }
    // 요청한 이메일이 있다면 비밀번호가 맞는지 확인한다.
	user.comparePassword(req.body.password, (err, isMatch) => {
  		if(!isMatch)
        	return res.json({
            	loginSuccess: false,
                message: "이메일 또는 비밀번호를 확인해 주세요.", 
            });
  		})
  });
    

  // 비밀번호까지 맞다면 토큰을 생성한다.

위에서 만든 메서드가 err과 isMatch를 return해주면, isMatch가 false일때(비밀번호가 일치하지 않을 때) loginSuccess는 false가 된다.
그럼 이제 일치할 때(드디어!) 로그인을 시켜주도록 해보자

토큰 생ㅅ...


이렇게 if블록 바깥에 generateToken이라는 메서드를 사용하려고 한다.
이 메서드도 model에서 만들어주어야 함
그런데 여기까지 하고 일단 끊으셨다

다음에 이어서..

profile
ㄱ이 아닌 개발자가 되고 싶은 사람

0개의 댓글