Node.js : 로그인

김가영·2020년 10월 6일
0

Node.js

목록 보기
4/34
post-thumbnail
  1. 요청된 email 을 db에서 찾고,

  2. 비밀번호가 일치하는 지 확인

  3. 토큰 생성 npm install jsonwebtoken --save

  4. 토큰 쿠키에 저장 npm install cookie-parser --save

요청된 email 찾기

  • index.js

app.post('/login',(req,res)=>{
	// 요청된 email 을 db에서 찾기
	User.findOne({email : req.body.email},(err,user)=>{
      
    	if(!user){
        	return res.json({
            	loginSuccess : false,
                message : "제공된 이메일에 해당하는 유저가 없습니다"
            })
        }
        
        //user.comparePassword()
        
    })
})

비밀번호가 맞는지 확인하기

  • User.js (Model)
userSchema.methods.comparePassword = function(plainPassword,cb){
	// plainPassword와 암호화된 비밀번호가 일치하는 지 확인
  
  bcrypte.compare(plainPassword, this.password, function(err,isMatch){
  	if(err) return cb(err);
    cb(null, isMatch);
  })
}


https://www.npmjs.com/package/bcrypt

  • index.js
app.post('/login',(req,res) => {
	User.findOne({email : req.body.email}, (err,user)=>{
    	...
    	user.comparePassword(req.body.password, (err, isMatch) => {
           if(!isMatch)
              return res.json({ loginSuccess : false, message : "비밀번호가 틀렸습니다"})
          
          // 토큰 생성하는 함수
          //user.generateToken();
          
        })
    
    }
}

토큰 생성하기

  • User.js (model)
userSchema.method.generateToken = function(cb){
  	var user = this;
 	 // json web token 이용하여 token 생성하기
	  // user id 와 두번째 param 으로 토큰을 만들고, param 을 이용하여 나중에 userid를 찾아낸다. 
	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
user.generateToken((err, user) => {
    	if(err) return res.status(400).send(err)
      
      	// token 을 쿠키에 저장한다
      	res.cookie("x_auth", user.token)
      	.status(200)
      	.json({loginSuccess : true, userId : user.user_id})
    })

token 은 쿠키 말고 local storage 에 저장해도 된다


최종

  • index.js
app.post('/login',(req,res)=>{
    // 요청된 email을 db에서 찾기
    console.log(req.body)
    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)
    
                // 토큰을 저장한다. 어디에? 쿠키, 로컬스토리지
                res.cookie("x_auth", user.token)
                .status(200)
                .json({loginSuccess : true, userId : user.user_id})
            })
    
        })

    })
    
})

  • User.js (model)
// cb : call back 
userSchema.methods.comparePassword = function(plainPassword, cb){
    // plainPassword를 암호화된 비밀번호와 일치하는지
    bcrypt.compare(plainPassword, this.password, function(err, isMatch){
        if(err) return cb(err);
        cb(null, isMatch)
    })
}

userSchema.methods.generateToken = function(cb){
    var user = this;
    // json web token 이용해서 token 생성하기
    // user id 와 두번째 param 으로 토큰을 만들고, param 을 이용하여 나중에 userid를 찾아낸다. 
    var token = jwt.sign(user._id.toHexString(), "secretToken")

    user.token = token;
    user.save(function(err, user){
        if(err) return cb(err);
        cb(null, user)
    })
}
profile
개발블로그

0개의 댓글