token 값을 만들어서 회원정보에 입력하는것 까지는 구현이 되었다
그리고 인증이 필요한 페이지에서 인증을 해주는 라우터를 구현하고있다
쉽지 않다
index.js
app.get("/api/users/auth", auth, (req, res) => {
// 여기까지 미들웨어를 통과해 왔다는 얘기는 인증이 true 라는 말
res.status(200).json({
_id: req.user._id,
isAdmin: req.user.role === 0 ? false : true,
isAuth: true,
email: req.user.name,
lastname: req.user.lastname,
role: req.user.role,
});
});
index.js 에서는 단순히 user의 정보를 json 으로 뿌려준다
그전의 과정이 중요하다 auth 라는 미들웨어를 살펴보자
*미들웨어란 중간다리 같은 역할이다 처리를 하기전에 중간에 거쳐가는 역할
auth.js
const { User } = require("../models/User");
let auth = (req, res, next) => {
// 인증처리를 담당할 미들웨어
// 1.클라이언트 쿠키에서 토큰값을 가져옴
let token = req.cookies.x_auth;
// 2.토큰을 복호화 한후 유저를 찾는다.
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();
});
// 3.유저가 있으면 인증O
// 4.유저가 없으면 인증X
};
module.exports = { auth };
auth req, res, next 를 받아와서 요청한 정보를 기반으로
성공 혹은 실패를 판별해주는 미들웨어 인듯하다(추측)
findByToken 이라는 method에 token 과 콜백함수를 넘겨주고 있다
findByToken 을 살펴보자
User.js
userSchema.statics.findByToken = function (token, cb) {
var user = this;
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);
});
});
};
첫번째로 jwt.verify 함수로 현재 클라이언트에 저장되어있는 토큰을 복호화 한다
복호화된 값은 _id값이며 회원정보중 _id값이 복호화된 토큰값인지를 찾는다
찾았다면 해당 회원정보의 token 값이 현재 클라이언트측에 저장된 token 값인지도 검사한다.
만약 정보가 틀리다면 콜백함수로 err객체를 넘겨주며
정보가 일치한다면 user 정보를 콜백함수로 넘겨준다.
auth.js
const { User } = require("../models/User");
let auth = (req, res, next) => {
// 인증처리를 담당할 미들웨어
// 1.클라이언트 쿠키에서 토큰값을 가져옴
let token = req.cookies.x_auth;
// 2.토큰을 복호화 한후 유저를 찾는다.
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();
});
// 3.유저가 있으면 인증O
// 4.유저가 없으면 인증X
};
User.js 에서 콜백함수로 user 정보를 넘겨주면
req.token= token;
req.user = user;
req.user 를 findByToken 에서 쿼리한 user의 정보로 바꿔준다.
index.js
app.get("/api/users/auth", auth, (req, res) => {
// 여기까지 미들웨어를 통과해 왔다는 얘기는 인증이 true 라는 말
res.status(200).json({
_id: req.user._id,
isAdmin: req.user.role === 0 ? false : true,
isAuth: true,
email: req.user.name,
lastname: req.user.lastname,
role: req.user.role,
});
});
authentication 이 유효한 상태이니깐
성공한 정보를 json 객체로 만들어서 응답해준다.
헷갈리는 부분이 많다
많이 해보면서 감을 익혀야겠다.