[Node.js/React] auth 기능을 통한 인증처리

·2023년 7월 3일
0

node-react 기초 공부

목록 보기
10/12
post-thumbnail

✔️ auth root

✔️auth root 만드는 이유?

  • 페이지 이동할 때마다 로그인 되어있는 상태인지 아닌지 확인 필요
    - 예를 들어, 글을 작성할 때나 삭제할 때 권한이 있는지

✔️그럼 이걸 대체 어떻게 할까?

  1. cookie에서 저장된 tokenserver에서 가져와서 복호화함

  1. 복호화 하면 user Id가 나오는데, 이를 이용하여 DBuser값이 저장되어있는 곳에서 해당 유저를 찾음
    • 이때 이 user Id라는건 사용자가 입력한 아이디라는 개념이 아닌, mongoDB에 값 저장될 때 생성되는 고유 아이디를 의미

  1. 이를 찾으면 쿠키를 받아온 token이 유저도 갖고 있는지 확인
    - 쿠키 일치X: authentication False
    - 쿠키 일치O: authentication True

✏️ findByToken 생성

// User.js

userSchema.statics.findByToken = function (token) {
    const user = this

    return new Promise((resolve, reject) => {
        // 토큰 decode 
        jwt.verify(token, 'secretToken', (err, decoded) => {
            if (err) {
                reject(err)
            }
			// id를 통해 유저 찾고
          	// 클라이언트에서 가져온 token과 DB에 보관된 토큰이 일치하는지 확인
            user.findOne({ '_id': decoded.userId, 'token': token })
                .then(user => {
                    resolve(user)
                })
                .catch(err => {
                    reject(err)
                })
        })
    })
}

✏️auth 기능 구현

이제 auth기능을 만들어줄건데, 그전에 middleware라는 폴더를 생성하여 이 안에 auth.js 파일을 생성한다.

참고로 현재 내 파일 구조 일부분은 아래와 같다.

// middleware/auth.js

const { User } = require('../models/User')

let auth = async (req, res, next) => {
    try {
        // 클라이언트 쿠키에서 토큰 가져옴
        let token = req.cookies.user_auth
        // 토큰을 복호화 후 유저 찾음
        const user = await User.findByToken(token);
        if (!user) {
            return res.json({ isAuth: false, error: true });
        }

        req.token = token;
        req.user = user;
        next()
    } catch (err) {
        throw err
    }
};

module.exports = { auth }

✏️auth api 추가

위에서 만든 auth를 사용하는 코드를 추가해주었고, get방식으로 api를 구현하였다.
인증과정이 이뤄지면 해당 결과에 대한 값을 json으로 반환하도록 하였다.

  • _id: DB에 저장된 유저 데이터에 대한 고유 아이디
  • isAdmin: admin인지 아닌지
  • isAuth: 성공적으로 인증이 이루어졌는지
  • email: 로그인된 계정
  • name: 유저의 이름 (없으면 반환X)
  • lastname: 유저의 lastname (없으면 반환X)
  • role: admin or 일반 유저
  • image: 유저의 이미지 (없으면 반환X)
//index.js

const { auth } = require('./middleware/auth')

// role 0: admin
// role 1: 일반 유저 
app.get('/api/users/auth', auth, (req, res) => {
    res.status(200).json({
        _id: req.user._id,
        isAdmin: req.user.role === 0 ? true : false,
        isAuth: true,
        email: req.user.email,
        name: req.user.name,
        lastname: req.user.lastname,
        role: req.user.role,
        image: req.user.image
    })
})

✏️실행 (postman)

우선 인증이 잘 되는지 테스트를 위해 login을 해준다.

현재 test@gmail.com계정이 로그인 되어있는지를 확인하기 위해
api/users/api에 접근한다.

그럼 위의 사진과 같이 _id, isAdmin, isAuth, email, role이 나타난다. 이때 _id는 로그인 했을 때 반환되었던 _id값과 동일하게 나오는것을 확인할 수 있으며, 이로써 해당 계정에 대한 인증이 성공적으로 이루어졌음을 알 수 있다.


👩‍💻 깃허브 주소

node-react

0개의 댓글