페이지 이동 때마다 로그인 여부 및 관리자 여부 등을 체크 하거나
글쓰기 및 수정 권한을 체크하기 위해 Auth route를 이용할 수 있다.
// index.js
const {auth} = require("./middleware/auth");
app.get('/api/users/auth', auth, (req, res) => {
// 미들웨어를 통과한 후 실행되는 코드 => Authentication이 True 이다.
// 성공했으므로 user 정보를 제공해준다. 페이지에서 user정보를 이용할 수 있어 편하다.
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
})
})
index.js 에서는 '/api/users/auth' 요청이 들어오면 미들웨어인 auth가 먼저 실행된다.
auth에서 인증처리 완료 후 성공하면 user의 정보를 제공해준다.
// 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에 넣어준다
req.token = token;
req.user = user;
next(); // 미들웨어이기 떄문에 next 해줘야 한다.
})
}
module.exports = { auth };
미들웨어 auth 에서는 쿠키에 x_auth로 저장했던 토큰을 가져와 복호화를 한다.유저인증에 성공하면 토큰과 유저정보를 request에 저장한다.
// models/User.js
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);
})
})
}
User.js에서는 쿠키에 저장된 토큰을 이용해 DB에서 user를 찾는다.
쿠키에 저장된 토큰과 서버에 저장된 토큰이 일치하는지 확인 후 사용자 정보를 전달해준다.
'Study > react' 카테고리의 다른 글
[React] Axios 및 Proxy 설정 (0) | 2021.10.27 |
---|---|
[React] react-router-dom (0) | 2021.10.27 |
[Node js] JWT 를 이용한 로그인 (0) | 2021.10.04 |
[Node js] Bcrypt로 비밀번호 암호화 (0) | 2021.09.27 |
[Node js] NodeMon 이용하기 (0) | 2021.09.27 |