- Auth 기능 만들기
- 회원 인증을 하기 위해 사용
- 쿠키에 저장 된 토큰을 서버에서 가져오고 복호화한다.
- 복호화 후 userId가 나오는데 이것을 이용하여 DB에서 유저를 찾은 후 쿠키에서 받아온
토큰이 유저를 가지고 있는지 확인
// auth 미들웨어
app.get('/api/users/auth', auth, (req, res) => {})
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();
})
// 유저가 있으면 인증 Okay
// 유저가 없으면 인증 No !
}
module.exports = { auth };
User.js 파일 안에서 findBytoken 메서드 생성
userSchema.statics.findByToken = function (token, cb) {
const 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 data 응답
app.get('/api/users/auth', auth, (req, res) => {
// 여기까지 미들웨어를 통과해 왔다는 것은 Authentication 이 True 라는 것
res.status(200).json({
_id: req.user._id,
isAdmin: req.user.role !== 0,
isAuth: true,
email: req.user.email,
name: req.user.name,
lastname: req.user.lastname,
role: req.user.role,
image: req.user.image
});
});
- methods와 statics의 차이점
- methods는 객체의 인스턴스를 생성해야 사용이 가능하다.
- statics는 객체의 인스턴스를 생성하지 않아도 사용이 가능하다(모델 자체를 가리킴)
- 로그아웃 기능 만들기
- 로그아웃 Route를 만든다.
- 로그아웃 하려는 유저를 DB에서 찾는다
- 유저의 토큰을 지워준다.
데이터 베이스에서 토큰을 지워주면 로그아웃
// auth 미들웨어를 사용하는 이유는 req.user 데이터를 사용하기 위함
app.get('/api/users/logout', auth, (req, res) => {
User.findOneAndUpdate({ _id: req.user._id },
{ token:"" },
(err, user) => {
if (err) {
return res.json({success: false, err});
}
return res.status(200).send({ success : true});
});
});
'Programming > Node.js' 카테고리의 다른 글
[Node.js] Express body-parser 너 뭐냐? (0) | 2021.10.13 |
---|---|
[MongoDB] mongoose.connection.on() & once() (0) | 2021.10.13 |
[Express.js] middleware란?? (0) | 2021.10.01 |
Node.js 교과서 express 미들웨어 (0) | 2020.11.27 |
따라하며 배우는 노드, 리액트 시리즈 - 기본 강의 Node.js part1 (0) | 2020.09.11 |