-
MERN 기본파일 만들기 - 5)login 기능 만들기(jsonwebtoken 사용)NODE.JS 2021. 5. 13. 13:28
jsonwebtoken 기능을 이용해서 입력한 정보와 db상의 정보 일치여부에 따라서 로그인 처리하는 기능을 만든다.
jsonwebtoken 사용법은 다음의 사이트에서 확인가능하다.
https://www.npmjs.com/package/jsonwebtoken
npm install jsonwebtoken --save를 실행해준다.
그 다음 index.js에 login api를 만든다.
제일먼저 이메일을 찾고, 비밀번호를 비교한후, token을 생성하는 단계로 넘어간다.
app.post('/api/users/login', (req, res)=>{ //find email User.findOne({email:req.body.email}, (err, user)=>{//1. 만약 같은 이메일이 데이터베이스에 존재하지 않는다면 err, 있다면 user if(!user) return res.json({ loginSuccess: false, message:"Auth failed, email not found" }); //2. compare password user.comparePassword(req.body.password, (err, isMatch)=>{ if(!isMatch){ return res.json({loginSuccess:false, message:"wrong password"}) } }); //3. generate the token 비밀번호 까지 맞다면 토큰 생성 user.generateToken((err, user)=>{ if(err) return res.status(400).send(err); //토큰을 저장한다. (쿠키나 로컬 스토리지. 우리는 쿠키에 하자) res .cookie("x_auth", user.token)//이름을 지정해서 거기에 user.token을 넣자 .status(200) .json({ loginSuccess:true }) }) }) });
여기서 password는 이전에 생성된 hash로 작성된 패스워드와 비교해야 하므로 사이트에 나온 compare사용 방법을 이용해서 비교한다.
models>User.js파일에 다음과 같은 부분을 추가해준다. (기능구현)
const jwt = require('jsonwebtoken'); userSchema.methods.comparePassword = function(plainPassword, cb){ //plain password와 데이터베이스에 있는 암호화 된 비밀번호를 비교해야 한다. bcrypt.compare(plainPassword, this.password, function(err, isMatch){ if (err) return cb(err); cb(null, isMatch) }) } userSchema.methods.generateToken = function(cb){//파라미터에 콜백하나만 넣어준다 //jsonwebtoken이용해서 토큰 생성한다. (user._id+'secret' = token) var user = this; var token = jwt.sign(user._id.toHexString(), 'secret')//유저의 아이디를 넣어주고, 아무거나 붙여줘서 생성하면 된다. 우리는 'secret'을 붙여주자 user.token = token; //토큰 필드에 토큰을 넣어준다. user.save(function(err, user){//사용자 정보 저장해준다. if(err) return cb(err); cb(null, user); }) } userSchema.statics.findByToken = function(token, cb){ var user = this; //userid를 찾으면 위에서 secret으로 넣어준다. 여기서 decode는 user_id(위에서 넘겨준)가 될 것이다. jwt.verify(token, 'secret', function(err, decode){ //이 아이디와 토큰을 가진 유저를 찾는다. user.findOne({"_id":decode, "token": token}, function(err, user){ if(err)return cb(err); cb(null, user); }) }) }
'NODE.JS' 카테고리의 다른 글
MERN 기본파일 만들기 - 8) heroku이용해서 웹 배포하기 (0) 2021.05.13 MERN 기본파일 만들기 - 6) authentification기능 구현하기(middleware사용) (0) 2021.05.13 MERN 기본파일 만들기 - 4)회원의 비밀번호 hash코드로 숨기기(bcrypt) (0) 2021.05.13 MERN 기본파일 만들기 - 3)nodemon 설치하고 private정보 숨기기 (0) 2021.05.13 MERN 기본파일 만들기 - 2) GIT설치하고 연결, SSH 파일 생성하고 등록하기 (0) 2021.05.10