728x90
Auth 를 왜 만들어야 하나 😉 ?
1. 페이지 이동 시 로그인되어있는지 안되어있는지, 관리자 유저인지 등을 체크
2. 글을 작성하거나 지워야 할 때, 권한이 있는지 체크
How !!
1. Cookie 에서 저장되어있는 Token을 Server에 가져와서 복호화를 한다.
2. 복호화를 하면 User ID가 나오게 된다. 그러한 User ID 를 이용하여 데이터베이스 User Collection에서 유저를 찾은 후, 쿠키에서 받아 온 token이 유저도 갖고있는지를 확인한다.
User.js
// user.js
...
userSchema.statics.findByToken = function ( token , cb ) {
var user = this;
user._id + '' = token;
// 토큰을 decode 한다.
// jsonwebtoken 에 작성되어 있는 코드이다.
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)
});
});
}
...
middleware/auth.js
// midleware/auth.js
const { User } = require('./model/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.js({ isAuth: false, error: true })
req.token = token;
req.user = user;
next(); // next 하는 이유 : middleware 과정이 끝난 후 계속 진행 가능하도록 사용
});
// 유저가 있으면, 인증 OK
// 유저가 없으면 인증 NO !
};
module.exports = { auth };
index.js
// index.js
...
// 예시 , role != 0 ( 어드민 ) , role === 0 ( 일반 유저 )
app.get('/api/users/auth', auth, (req, res) => {
// 여기까지 미들웨어를 통과해 왔다는 이야기는 ? Authentication 이 True 라는 말.
res.status(200).json({
_id: req.user._id,
isAdmin: req.user.role === 0 ? false : true,
email: req.user.email,
name: req.user.name,
lastname: req.user.lastname,
role: req.user.role,
image: req.user.image
})
});
반응형
'Front-end > Node.js' 카테고리의 다른 글
#9. 로그아웃 기능 (0) | 2021.01.11 |
---|---|
#7. Bcrypt 로 비밀번호 암호화 하기 (0) | 2020.12.12 |
#6. 환경 변수 process.env.NODE_ENV 설정하기 (0) | 2020.11.25 |
#5. Nodemon 설치 (0) | 2020.11.24 |
#4. BodyParser & Postman & 회원 가입 기능 (0) | 2020.11.18 |