ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • auth 기능 구현
    Study/Node, React 기초 강의_John Ahn 2023. 2. 19. 13:05

    루트 디렉터리에 middleware 폴더 생성

     

    middleware 폴더에 auth.js 구현

    // User 모델을 불러옴
    const { User } = require('../models/User');
    
    let auth = (req, res, next) => {
    
        // 인증 처리를 하는 곳
    
        // 클라이언트 쿠키에서 토큰을 가져온다.
        let token = req.cookies.x_auth;
    
        // 토큰을 복호화한 후 유저를 찾는다.
        User.findByToken(token, (err, user) => {
            if (err) throw err;
            if (!user) return res.json({ isAuth: false, error: true })
    
            req.token = token;
            req.user = user;
            next();
        })
    
        // 유저가 있으면 인증 Okey
    
        // 유저가 없으면 인증 No!
    }

     

    User.js에 userSchema.statics.findByToken 구현

     

    userSchema.statics.findByToken = function(token, cb){
        var user = this;
    
        // 토큰을 decode한다.
        jwt.verify(token, 'secretToken', function (err, decoded) {
            // 유저 아이디를 이용해서 유저를 찾은 다음에 클라이언트에서 가져온 token과 DB에 보관된 토큰이 일치하는지 확인
    
            user.findOne({ "_id": decoded, "token": token }, function (err, user) {
                if (err) return cb(err);
                cb(null, user)
            })
        })
    }

     

    index.js에 권한에 대한 처리 구현

     

    // express 모듈을 추가
    const express = require('express')
    // 새로운 express 모듈을 생성
    const app = express()
    // port 설정
    const port = 5000
    // User 모델을 가져옴
    const { User } = require("./models/User");
    // bodyPaser를 가져옴
    const bodyPaser = require("body-parser");
    // config를 가져옴
    const config = require('./config/key');
    // cookieParser를 가져옴
    const cookieParser = require("cookie-parser");
    // auth를 가져옴
    const { User } = require('./middleware/User');
    
    // bodyPaser 옵션주기
    // application/s-www-form-urlencoded
    app.use(bodyPaser.urlencoded({ extended: true }));
    // application/json
    app.use(bodyPaser.json());
    app.use(cookieParser());
    
    // mongoose 연결
    const mongoose = require('mongoose')
    // error 발생을 막기 위한 코드
    mongoose.connect("mongodb+srv://<아이디>:<비밀번호>@boilerplate.6t2ootw.mongodb.net/?retryWrites=true&w=majority"
    ).then(() => console.log('MongoDB Connected...'))      // DB 연결 확인을 위한 코드
        .catch(err => console.log(err))
    
    // Hello World! 전송
    app.get('/', (req, res) => {
        res.send('Hello World!!')
    })
    
    app.post('/api/user/register', (req, res) => {
    
        // 회원 가입 할때 필요한 정보들을 client에서 가져오면 그것들을 데이터 베이스에 넣어준다.
    
        const user = new User(req.body)
    
        user.save((err, userInfo) => {
            if (err) return res.json({ success: false, err })
            return res.status(200).json({
                success: true
            })
        })
    })
    
    app.post('/api/user/login', (req, res) => {
        User.findOne({ email: req.body.email }, (err, user) => {
    
            // 요청된 이메일을 데이터베이스에서 있는지 찾는다.
            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 req.json({ loginSuccess: false, message: "비밀번호가 틀렸습니다." })
    
                // 비밀번호 까지 맞다면 토큰을 생성하기.
                user.generateToken((err, user) => {
    
                    if (err) return res.status(400).send(err);
    
                    // 토큰을 저장한다. 어디에? 쿠키 or 로컬스토리지
                    res.cookie("x_auth", user.token)
                        .status(200)
                        .json({ loginSuccess: true, userId: user._id })
                })
    
            })
        })
    })
    
    app.get('/api/user/auth', auth, (req, res) => {
    
        // 여기까지 미들웨어를 통과해 왔다는 얘기는 Authentication이 True라는 말.
        res.status(200).json({
            _id: req.user._id,
            isAdmin: req.user.role === 0 ? false : true,
            isAuth: true,
            email: req.user.email,
            name: req.user.role,
            lastname: req.user.lastname,
            role: req.user.role,
            image: req.user.image
        })
    })
    
    // 5000번 port에서 실행
    app.listen(port, () => {
        console.log(`Example app listening on port ${port}`)
    })

    'Study > Node, React 기초 강의_John Ahn' 카테고리의 다른 글

    토큰 생성  (0) 2023.02.19
    로그인 기능 구현  (0) 2023.02.19
    Bcrypt를 이용한 비밀번호 암호화  (0) 2023.02.19
    비밀 설정 정보 관리  (0) 2023.02.19
    Nodemon  (0) 2023.02.14
Designed by Tistory.