로그인 기능 만들기(with Bcrypt)

이연중·2021년 4월 19일
0

Node.js

목록 보기
9/14

설치


npm install jsonwebtoken --save

npm install cookie-parser --save

구현


User.js

const jwt=require('jsonwebtoken');
//생략

userSchema.methods.comparePassword=function(plainPasswprd,cb){
    //plainPassword와 암호화 된 비밀번호(해싱값)가 같은지 체크
    bcrypt.compare(plainPasswprd,this.password,function(err,isMatch){
        if(err) return cb(err);
        cb(null,isMatch);
    });
}

userSchema.methods.generateToken=function(cb){
    var user=this;

    //jsonwebtoken을 이용해 토큰 생성
    var token= jwt.sign(user._id.toHexString(),'secretToken');
    user.token=token;
    user.save(function(err,user){
        if(err) return cb(err);
        cb(null,user);
    });
}

//생략

index.js

const cookieParser=require('cookie-parser');

app.use(cookeParser());
//생략

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: "비밀번호가 틀림"});
      //비밀번호까지 일치하면, 토큰 생성
      user.generateToken((err,user)=>{
        if(err) return res.status(400).send(err);
        //토큰 저장. where? 쿠키, 로컬 스토리지, 세션(여기서는 쿠키에 저장)
        res.cookie("x_auth",user.token)
        .status(200)
        .json({loginSuccess:true, userId: user.id});
      });
    });
  });
    
//생략

참고

www.inflearn.com/course/따라하며-배우는-노드-리액트-기본

profile
Always's Archives

0개의 댓글