For Programmer
9.Auth기능 만들기 - boiler-plate 제작(backend) 본문
728x90
1.document를 생성하지 않아도 접근할 수있는 사용자정의 메서드 만들기(몽고DB 제공기능)
*static라는 기능을 이용하며 토큰의 정보를 입력했을때 해당 토큰을 복호화 하여 해당유저가 있을경우 그정보를 넘겨주는 코드(models-User.js)
const jwt = require("jsonwebtoken");
userSchema.statics.findByToken = function (token, cb) {
var user = this;
//토큰을 decode한다.
jwt.verify(token, "secretToken", function (err, decoded) {
//decoded:복호화된_id값
//유저아이디를 이용해서 유저를 찾은 다음에 클라이언트에서 가져온 token과
//DB에 보관된 토큰이 일치하는지 확인
//저장할때 user._id + 'secretToken'으로 저장했기 때문에 복호화할때도
//'secretToken'때고 user_.id만 복호화해서 decoded에 저장됨
user.findOne({ _id: decoded, token: token }, function (err, user) {
if (err) return cb(err);
cb(null, user);
});
});
};
2. middleware 만들기(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에 넣으면 index.js에있는 app.get에 req에서 사용가능
req.user =user; //상동
next(); //index.js에서 app.get( ~~, auth ,~~) 인데 next를안해주면 다음으로안너어감
})
//유저가 있으면 인증 okay
//유저가 없으면 인증 no!
}
module.exports = auth;
3. 라우터에 auth 통신하는 함수 만들기(routes-user.js)
router.get("/auth", auth, (req, res) => {
//여기까지 미들웨어를 통과해 왔다는 얘기는 Authentication 이 True라는말
res.status(200).json({
_id: req.user._id,
isAdmin: req.user.role === 0 ? false : true, //0이면 일반유저,0이아니면 관리자
isAuth: true,
email: req.user.email,
name: req.user.name,
lastname: req.user.lastname,
role: req.user.role,
image: req.user.image,
});
});
*static으로 만든 메서드와 methods 로 만든 메서드의 차이점
static으로 userschema에 등록하면 굳이 생성자(다큐먼트생성)없이 바로 User.함수명 으로 접근할 수있다. userschema.method로 메서드를 정의하게 되면 메서드를 사용하기 위해 생성자로 다큐먼트를 생성하는 작업이 필요하다.
-> const user = new User(req.body);
동영상강의
728x90
'React & Node.js 프로젝트 > boiler-plate 제작' 카테고리의 다른 글
11.React 시작하기 - boiler-plate제작(frontend) (0) | 2020.08.02 |
---|---|
10. 로그아웃 기능 만들기 - boiler-plate 제작(backend) (0) | 2020.08.01 |
8. 로그인 기능 만들기 - boiler-plate 제작(backend) (0) | 2020.08.01 |
7. 데이터베이스 내의 비밀번호 암호화하기 - boiler-plate 제작(backend) (0) | 2020.07.31 |
6. 비밀정보보호하기(github에 올리지않기) - boiler-plate 제작(backend) (0) | 2020.07.31 |
Comments