jsonwebtoken / Auth / 로그아웃 기능 / node.js / #11~#14

해버니·2022년 7월 25일
0

노드 & 리액트

목록 보기
4/9
post-thumbnail

로그인 기능




해야 할 것

  1. 요청된 이메일이 데이터베이스에 있는지 찾는다.

    User.findOne()

  2. 요청된 이메일이 데이터베이스 안에 있다면 비밀번호가 맞는지 확인

    Bcrypt를 이용하여 plain password와 암호화된 (Hashed) 패스워드가 같은지 확인

  3. 비밀번호까지 맞다면 Token을 생성하기.

    토큰 생성을 위해서 JSONWEBTOKEN 라이브러리를 다운로드.
    npm install jsonwebtoken --save












토큰 생성을 위해서JSONWEBTOKEN 라이브러리를 다운로드





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





쿠키 파서 깔기




로그인 완료!!



로그인 실패시 이렇게 뜬다.
무한 로딩 떠서 여러 댓글들을 찾아봐서 고쳤더니 해결이 되었다!
-> 아니 뭘 고쳤는지 써놨어야지 과거의 나야!!




index.js

app.use(cookieParser());

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.statue(400).send(err);
            
            // 토큰을 저장한다. 어디에? (저장하고 싶은 대로) 쿠키 or localstorage 등등 -> 여기서는 쿠키에 저장을 할 것이다.
            // 쿠키를 이용하려면 깔아야하는 게 있다.
            	res.cookie("x_auth", user.token)
                .statue(200)
            	.json({ loginSuccess: true, userId: user._id })
        })
    })
})




User.js

userSchema.methods.comparePassword = function(plainPassword, cb){
	// 콜백 function
	// plainPassword 랑 데이터베이스에 있는 암호화된 비밀번호를 비교.
    // 데이터베이스에 있는 비밀번호를 복호화할 수 없다.
    // 그러므로 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; 
    
    // jsonwebtoken을 이용해서 token을 생성하기
    // 'secretToken' -> 아무렇게나 적어줘도 된다.
    var token = jwt.sign(user._id.toHexString(), 'secretToken') 
    
    user.token = token
    user.save(function(err, user) {
    	if(err) return cb(err)
        cb(null, user)
    })
}






Auth

auth rounte 만들기
1. 페이지 이동 때마다 로그인되어있는지 안 되어 있는지, 관리자 유저인지 등을 체크
2. 글을 쓸 때나 지울 때 권한이 있는지 체크


어떤 사이트를 들어갔을 때 여러 개의 페이지가 있다.
근데 어떤 페이지는 로그인 된 유저들만 사용할 수 있고 또 다른 페이지는 로그인이 안되어도 사용할 수 있는 페이지가 있는데 이걸 관리하기 위해서 필요한 것이 Auth 기능이다.
Auth는 middleware 기능을 해주는 장치이다.




미들웨어

미들웨어는 서로 다른 애플리케이션이 서로 통신하는 데 사용되는 소프트웨어






"middleware" 폴더 생성 뒤 -> "auth.js" 파일 만들어주기








로그아웃 기능 만들기



app.get('api/users/logout', auth, (res, req) => {
  User.findOneAndUpdate({ _id: req.user._id },
    { token: ""}
    , (err, user) =>{
      if (err) return res.json({ success: false, err});
      return res.status(200).send({
        success: true
      })
    })
})

index.js 에 로그아웃 기능 추가




token이 있는 아이디로 되는지 실행해보기


성공적으로 완!

근데 나 왜 있는 대로 로그인 하려고 하는데 비번이 자꾸 틀렸다고 하냐 ㅠㅠ

0개의 댓글