Node.js 서버 개발(4)

권규리·2024년 2월 28일

🧱Node.js

목록 보기
4/15

🗝️ 로그인 기능 구현

index.js에서 로그인 route 만들기

route 안에서 구현 해야할 것

  • DB에서 요청받은 이메일 찾기
  • DB에 요청받은 이메일이 있다면, DB에 저장된 비밀번호와 요청받은 비밀번호가 같은지 확인
  • 비밀번호까지 같다면 Token을 생성

👩🏻‍💻 Token 생성을 위해서 JSONWEBTOKEN 라이브러리 다운로드

npm install jsonwebtoken --save

👩🏻‍💻 Token 저장을 위해서 Cookie 라이브러리 다운로드

npm install cookie-parser --save

(1) index.js

app.post('/api/users/login', async(req, res)=> {

    try{
        //  ⭐1. client로부터 요청된 이메일이 DB에 있는지 확인
        const user= await User.findOne({ email: req.body.email })

        if(!user){
            return res.json({
                loginSuccess: false,
                message: "요청받은 이메일에 해당하는 유저가 없습니다."
            })
        }

        // ⭐2. 요청된 이메일이 있다면, 비번이 맞는지 확인
        // comparePassword 메서드는 usermodel에서 생성
        const isMatch= await user.comparePassword(req.body.password);
        if(!isMatch){
            return res.json({ loginSuccess: false, message: "비밀번호가 틀렸습니다." }) 
        }

        // ⭐3. 비번이 맞다면, 토큰 생성
        //generateToken 메서드 또한 usermodel에서 생성
        const userdata= await user.generateToken();
      
      	// client에게 보내줄 res 내용
        res
        	// 'x_auth'라는 이름으로 유저의 Token을 Cookie에 저장
            .cookie("x_auth",user.token)
            .status(200)
            .json({loginSuccess:true, userId: user._id})
    } catch(err){
        return res.status(400).send(err)
    }
})

(2) User.js

userSchema.methods.comparePassword = function (plainPassword) {
  
    // client가 보낸 비밀번호 (=plainpassword)와 DB에 암호화된 비밀번호가 같은지 확인
    const result = bcrypt.compare(plainPassword, this.password);
    return result;
    };
    
    
userSchema.methods.generateToken = async function (cb) {
    var user = this;
  
    // jsonwebtoken을 이용해서 token을 생성
    // user._id(DB의 _id) + secreToken = token
    // token으로 user를 판별할 수 있다.
    var token = jwt.sign(user._id.toHexString(), 'secretToken');

    user.token = token;

    try {
    	const savedUser = await user.save();
    	return user;
    } catch (err) {
    	return err;
    }
};

📖 token 만들 때 참고 !!

var jwt = require('jsonwebtoken');
var token = jwt.sign({ foo: 'bar' }, 'shhhhh');

postman 결과

body에 이메일과 비밀번호를 넣고 Send 하면 아래에 결과값이 나타난다.

profile
기록장 📝

0개의 댓글