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
'Frontend > react' 카테고리의 다른 글
schema.methos랑 schema.statics의 차이 (0) | 2022.07.07 |
---|---|
logout 기능 (로그아웃) (0) | 2022.07.07 |
로그인 기능(유저정보, 비밀번호 비교, 토큰 생성) (0) | 2022.07.05 |
bcrypt 정보 암호화 (0) | 2022.06.26 |
비밀 정보 보호 (DB 계정 정보 보호) (0) | 2022.06.23 |