Auth Boiler Plate with Node.js-Authentication
29 Apr 2021 | Node.jsBoiler Plate with Node.js - Authentication
Authentication
사용자가 제한된 페이지 접근시 로그인된 유저인지 혹은 관리자인지 등을 체크할 수 있는 auth route를 만든다
글 작성, 삭제 등 제한된 액션을 취할때에도 권한이 있는지 여부를 체크할 수도 있다
-
클라이언트는 쿠키의 토큰을 서버에 전송한다
- 서버에서는 토큰을 decode하여 나온 user ID로 DB에서 해당 유저를 찾는다
- 클라에게 받은 토큰과 DB에서 검색한 유저의 토큰을 비교한다
- 일치 여부에 맞는 액션을 취한다
먼저, root folder에 middleware 폴더를 만들고 그 안에 auth.js 파일을 만든다
미들웨어가 없으면 무수히 생성될 api 들을 관리하기가 어려워진다
// 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;
// 유저가 없으면 인증 no
if (!user) return res.json({ isAuth: false, error: true });
// 유저가 있으면 인증 ok
// requst에 토큰과 유저를 담아서 index에서 사용
req.token = token;
req.user = user;
next();
});
};
module.exports = { auth };
위의 findByToken은 토큰으로 해당 유저를 검색하는 메소드로 User.js에서 정의한다
// User.js
userSchema.statics.findByToken = function (token, cb) {
var user = this;
// Token decode => id
jwt.verify(token, 'secretToken', function (err, decoded) {
// 유저 아이디로 해당 유저 검색 후 클라의 토큰과 DB의 토큰 일치 여부를 확인
user.findOne({ _id: decoded, token: token }, function (err, user) {
if (err) return cb(err);
cb(null, user);
});
});
};
// index.js
const { auth } = require('./middleware/auth');
app.get('/api/users/auth', auth, (req, res) => {
// 미들웨어 통과 => auth 통과
res.status(200).json({
_id: req.user._id,
// 0 : 일반, 1 이상 : 관리자
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,
});
});