• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    미해결

bcrypt의 compare메서드의 리턴값이 계속 false로 나오는데요, 어떻게 하면 true를 반환할까요

22.04.27 18:27 작성 조회수 485

0

안녕하세요, 제로초님!

bcrypt의 compare 함수의 return 값이 계속 false가 나와서, 혹시 제시해주실 힌트가 있으실지 글을 남겨봅니다

 

이와 관련해 구글링에서 제시한 방법들을 적용해봤는데도, 계속적으로 false가 리턴됩니다ㅠ…

 

: 1. password 타입의 length를 늘리기(데이터가 짤려서 출력될 수 있다고 하여,,)

: 2. password 타입을 string 타입으로 변환? 후 디비에 저장하기

: 3. pre 미들웨어를 사용할 경우, pre()특성상 반복적?으로 pwd를 해싱하기 때문에 isModified()/ .isNew() 일 경우를 추가하기

: 4. compare()함수의 인자를 작성시, 인자의 순서 체크 - 첫번째인자는 유저가 입력한것, 두번째는 hashed되어 디비에 저장된 패스워드로 입력하기

 

위와 같이 해결방법을 찾았는데요,,,

 

1,2번은 이미 mongoose에서 해결해주는 부분이라 패스하고,,,

3,4번은 적용을 했는데도 ㅠ

comprare함수의 리턴값이 false로 나옵니다,,,

 

compare함수의 리턴값이 false여도... 

false를 true라고;;; 조건식을 변경하면;;;;

입력한 값에 해당하는, json객체가 출력되어 문제는 없지만,,,,

(아래 authController.js파일,  !passwordMatch를 passwordMatch로 변경하면 원하는 로직대로 나오지만 ㅠ )

(폼에 입력한 값에 해당한, json객체가 나와서 문제는 없는데..)

 

 

false를 true라고 가정하고;; 

코드를 변경하면 원하는 결과를 얻게 되는데,,,

작성된 코드가 ,,,이건 아닌거 같아서요 ㅠ

 

왜 계속,,,false를 반환할까요,,;;

bcrypt말고 다른 라이브러리를 사용해야할까요??

 

감사합니다,

 

 

p.s) 

추가 질문입니다.

 

1. issModified(‘password’) || isNew()
User.js 내용 중

UserSchema.pre('save', async function () {…} 부분에서,

isModified(‘password’) || isNew() 이하 블록이 실행되는 조건은,

password가 변경되거나 처음 입력될 경우 실행되는 건지요,

제가 잘 이해하고 코드를 작성했는지 궁금합니다   

 

2. 에러 핸들링

bycript 공식홈페이지나 관련 코드를 구글링을 해보면, 코드를 콜백방식으로 작성한걸 심심치 않게 볼수 있는데요,

저는 async-await로 작성해서, 이걸어떻게 에러 핸들링 코드를 작성해야할까요?

try..catch로도 충분할까요?

 

--------------------------------------------------------------------------------------------------------------------------

 

User.js

import bcrypt from 'bcrypt';

import mongoose from 'mongoose';

 

const UserSchema = new mongoose.Schema(

  {

   …중략…

    password: {

      type: String,

      required: true,

      min: 6,

    },

    …중략…

  },

  { timestamps: true }

);

 

UserSchema.pre('save', async function () {

  try {

    const salt = await bcrypt.genSalt(10);

    if (this.isModified('password') || this.isNew()) {

      this.password = await bcrypt.hash(this.password, salt);

    }

  } catch (err) {

    console.log(err);

  }

});

 

const User = mongoose.model('User', UserSchema);

 

export default User;

 

 

authController.js

export const login = async (req, res) => {

  try {

    const {

      body: { email, password },

    } = req;

 

    const user = await User.findOne({ email: email });

 

    if (!user) { // user가 ! 없는것이 맞다(true)면 = user가 없다면

      return res.status(404).json({ error: 'user is not found' });

    } else {

      const passwordMatch = await bcrypt.compare(password, user.password);

     

      //부정문을 먼저 시작하는 조건식

     // passwordMatch가 false로 나와 계속 { error: 'Invalid Password' }를 출력

     // !passwordMatch에서 !을 제거하면 원하는 결과 도출

 

      if (!passwordMatch) { // match되는 password가 !없다는게 맞다(true)면   

        return res.status(400).json({ error: 'Invalid Password' });

      }

      return res.status(200).json(user);

    }

  } catch (err) {

    return res.status(401).json(err);

  }

 

};

 

 

 

 

답변 1

답변을 작성해보세요.

0

salt를 왜 넣으시는거죠? 누구 코드를 보고 하시고 계신건가요? 제 강좌 코드를 따라하세요. 저도 제 코드가 아닌 부분은 모릅니다.

async await 에러는 try catch로 해결하시면 됩니다.