Frontend/react

Auth (인증/인가)기능

dddzr 2022. 7. 7. 22:27

0. Auth

인증(Authentication)

사용자의 신원을 증명

ID와 Password로 로그인하는 과정

JWT나 Session을 이용해 인증을 유지

인가(Authorization)

특정 리소스에 접근할 수 있는 권한을 부여

 

페이지 이동 때마다 로그인 여부, 유저 role(권한) 체크

Cookie에서 인코딩된 Token을 Server에 가져와서 복호화.

복호화 하면 User ID가 나옴.

1. auth route 생성

index.js

///api/users user랑 관련된거 앞에 붙여주기 나중에 Router(express에서 제공)로 관련기능별로 정리 필요
const { auth } = require('../middleware/auth'); //쩜두개: 상위폴더로

app.get('/api/users/auth', auth, (req, res) => {//auth는 미들웨어
  //미들웨어 통과. Authentication True
  //client에 유저 정보 제공
  res.status(200).json({
    _id: req.user._id,//미들웨어에서 req에 넣은 정보
    //임의로 정한 role
    // 0: 일반 유저(0이아니면 관리자), 1: admin, 2: 특정 부서 admin
    isAdmin: req.user.role === 0 ? false : true,
    isAuth: true,
    email: req.user.email,
    name: req.user.name,
    role: req.user.role,
    image: req.user.image
  })

})

 

2. auth 미들웨어 생성

루트폴더에 middleware 폴더 생성

auth.js 생성

auth.js

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

let auth = (req, res, next) => {
    //인증 처리

    //클라이언트 쿠키에서 토큰을 가져옴
    let token = req.cookies.x_auth; //x_auth는 index에서 토큰 넣은 이름

    //토큰을 복호화 한 후 유저를 찾음
    User.findByToken(token, (err, user) => {
        if(err) throw err;
        if(!user) return res.json( {isAuth: false, error: true})

        //inext.js에 auth 라우터에서 req를 받아서 사용할 수 있도록 넣어줌
        req.token = token;
        req.user = user;
        next();//auth가 미들웨어로 User.js에서 쓰여서 다음으로 넘어가도록 next

    })//User.js에 생성한 함수
}

module.exports = { auth };

 

3. findByToken 함수 생성

User.js

userSchema.statics.findByToken = function( token, cb ){
    var user = this;

    //토큰을 decode
    jwt.verify(token, 'secretToken', function(err, decode){
        //findOne는 moongoDB 함수, DB에서 유저정보 찾기
        user.findOne({"_id": decode, "token": token}, function(err, user){
            if(err) return cb(err);
            cb(null, user)
        })
    });
}

*statics함수로 생성

 

token은 암호화된 상태, 토큰을 생성할 때 사용했던 문자열(여기서는 'secretToken')을 파라미터로 넣고

verify함수를 사용하여 복호화.

함수 사용법은 아래 링크 참고.

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

 

jsonwebtoken

JSON Web Token implementation (symmetric and asymmetric). Latest version: 8.5.1, last published: 3 years ago. Start using jsonwebtoken in your project by running `npm i jsonwebtoken`. There are 19967 other projects in the npm registry using jsonwebtoken.

www.npmjs.com