#13 Auth 기능 만들기

2022. 8. 4. 21:27TIL/따라하며 배우는 노드 리액트

728x90
[인프런] 따라하며 배우는 노드, 리액트 시리즈 - 기본강의를 들으며 정리한 내용입니다.

 

 

페이지 이동 때마다 로그인 되어있는지 안되어 있는지, 관리자 유저인지 등을 체크하기위해서 필요

글을 쓸 때나 지울 때, 해당 권한이 있는지 등의 체크시에도 필요함

쿠키에 넣어준 토큰과 서버에 저장된 데이터가 동일한지 체크하는 과정

 

 

1. middleware폴더 생성, auth.js 파일 생성

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();
		})
}

module.exports = { auth };

2. User.js 파일에 메소드 추가하기

userSchema.statics.findByToken = function (token, cb) {
		let user = this;
		
		jwt.verify(token, 'secretToken', function(err, decoded){
			user.findOne({"_id": decoded, "token": token}, function(err, user){
				if(err) return cb(err);
				cb(null, user);
			})
		})
}

3. auth route 생성하기(index.js)

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

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