2017-11-26 7 views
0

인증 경로에 대한 게시 요청을 수행 할 때마다 매 토큰을 이전 토큰에 추가합니다. 나는이 문제jwt.sign() 매번 이전 토큰에 토큰을 추가했습니다.

const express = require("express"); 
const router = express.Router(); 
const User = require("../models/user"); 
const bcrypt = require("bcryptjs"); 
const config = require("../config/data"); 
const jwt = require("jsonwebtoken"); 
const mongoose = require("mongoose"); 

//Registration route 
router.post("/register",(req,res)=>{ 
    let date=new Date(); 
    let newUser = new User({ 
     name:req.body.name, 
     email:req.body.email, 
     password:req.body.password, 
     role:"User", 
     isActive:true, 
     created:date, 
     updatedToken:"JWT" 

    }); 
    User.addUser(newUser,(err,user)=>{ 
     if(err){ 
      res.json({success: false, msg:'Failed to register user'}); 
      } else { 
      res.json({success: true, msg:'User registered'}); 
      } 
    }); 


}); 

//Authentication route 
router.post('/authenticate', (req, res) => { 
    const email = req.body.email; 
    const password = req.body.password; 

    User.getUser(email, (err, user) => { 
     if(err) throw err; 
     if(!user){ 
     return res.json({success: false, msg: 'User not found'}); 
     } 

     User.comparePassword(password, user.password, (err, isMatch) => { 
     if(err) throw err; 
     if(isMatch){ 
      let payload={ 
      name:user.name, 
      email:user.email, 
      role:user.role, 
      deleted:user.deleted, 
      isActive:user.isActive, 
      created:user.created, 
      updatedToken:user.updatedToken, 
      }; 

      let token=jwt.sign(payload,config.secret) 

      User.saveToken(email,token,(err,success)=>{ 
      if(err) return err; 
      console.log("Success"); 
      res.json({ 
       success: true, 
       token: token 
      }); 
      }); 


     } else { 
      return res.json({success: false, msg: 'Wrong password'}); 
     } 
     }); 
    }); 
    }); 
// router.use(function(req, res, next) { 

//  // check header or url parameters or post parameters for token 
//  var token = req.body.token || req.query.token || req.headers['x-access-token']; 

//  // decode token 
//  if (token) { 

//   // verifies secret and checks exp 
//   jwt.verify(token, app.get('superSecret'), function(err, decoded) {  
//   if (err) { 
//    return res.json({ success: false, message: 'Failed to authenticate token.' });  
//   } else { 
//    // if everything is good, save to request for use in other routes 
//    req.decoded = decoded;  
//    next(); 
//   } 
//   }); 

//  } else { 

//   // if there is no token 
//   // return an error 
//   return res.status(403).send({ 
//    success: false, 
//    message: 'No token provided.' 
//   }); 

//  } 
//  }); 

//  // Dashboard 
// router.get('/dashboard', (req, res) => { 
// res.json({user: req.user}); 
// }); 

module.exports = router; 

의 이유를 찾을 수 없습니다 그리고 이것은 스키마 및 기능

const mongoose = require("mongoose"); 
const bcrypt = require("bcryptjs"); 
const config = require("../config/data"); 
const jwt = require("jsonwebtoken"); 

let userSchema = mongoose.Schema({ 
    name:{ 
     type:String, 
     required:true 
    }, 
    email:{ 
     type:String, 
     required:true 
    }, 
    password:{ 
     type:String, 
     required:true 
    }, 
    role:{ 
     type:String, 
     required:true 
    }, 
    deleted:{ 
     type:Date, 
     default:null, 

    }, 
    isActive:{ 
     type:Boolean, 
     required:true 
    }, 
    created:{ 
     type:Date, 
     required:true 
    }, 
    updatedToken:{ 
     type:String, 
     required:true 
    } 
}); 

let User = module.exports = mongoose.model('User',userSchema,'Users'); 


module.exports.getUser = function(username, callback){ 
    let query = {email: username} 
    User.findOne(query, callback); 
} 

module.exports.addUser = function(newUser, callback){ 
    bcrypt.genSalt(10, (err, salt) => { 
    bcrypt.hash(newUser.password, salt, (err, hash) => { 
     if(err) throw err; 
     newUser.password = hash; 
     newUser.save(callback); 
    }); 
    }); 
} 

module.exports.comparePassword = function(candidatePassword, hash, callback){ 
    bcrypt.compare(candidatePassword, hash, (err, isMatch) => { 
    if(err) throw err; 
    callback(null, isMatch); 
    }); 
} 
module.exports.saveToken = function(username,token,callback){ 
    let query = {email:username}; 
    let updateToken={updatedToken:token}; 
    User.findOneAndUpdate(query,updateToken,callback); 
} 
module.exports.generateToken=function(payload,secret){ 
    let token = jwt.sign(payload,secret,{ 
     expiresIn: 604800 
    }) 
    return token; 
} 

이 서버

const express = require ("express"); 
const app = express(); 
const bodyParser = require("body-parser"); 
const mongoose = require("mongoose"); 
const config = require("./config/data"); 
const cors = require("cors"); 
const morgan = require("morgan"); 

const route = require("./routes/users"); 
mongoose.Promise = global.Promise; 

let options = { 
    useMongoClient: true, 
    reconnectTries: Number.MAX_VALUE, 
    reconnectInterval: 500, 
    poolSize: 10, 
    bufferMaxEntries: 0 
    }; 

mongoose.connect(config.database,options); 

let db = mongoose.connection; 
db.on('error', console.error.bind(console, 'connection error:')); 
db.once('open', function() { 
console.log(`DB connected ${new Date()}...`); 
}); 


app.use(bodyParser.json()); 

app.use(cors()); 

app.use(morgan('dev')); 

app.get('/',(req,res)=>{ 
    res.send("Works aziz"); 
}); 

app.use("/users",route); 


app.listen(config.port,()=>{ 
    console.log(`Server running ${config.port}...`); 
}); 

이다 나는 것이 필요하다 사용자가 pos를 수행하는 경우 t 라우트를 인증하라는 요청을 보내면 토큰을 생성하여 사용자가 포스트 요청을 할 때마다 연결하지 않고 변수 토큰에 제공해야합니다. 대단히 감사합니다 !!!!!!

+0

시도 : findOneAndUpdate (query, {$ set : updateToken}, callback) –

+0

나는 시도했지만 jwt.sign() 메서드에서 문제가 발생하면 사용자가 게시물 요청을 할 때마다 토큰을 만들어야하며 jwt.sign() 메서드의 값이지만 이전의 모든 요청 값을 가져 와서 모두 연결합니다. 답변 주셔서 감사합니다)))))) –

+0

공유 할 수있는 공개 프로젝트입니까? 나는 복제 할 수없는 것처럼 보였기 때문에 그것을 복제하고 시도하고 싶다. –

답변

0

페이로드 내에 updatedToken:user.updatedToken, 오류가있는 것 같습니다. 처음 등록 할 때는 JWT입니다. 등록 컨트롤러에서 설정 한 것이기 때문입니다. 예 : 실제 값 최초 인증 후

let payload={ 
    name: "testuser", 
    email: "[email protected]", 
    role: "user", 
    deleted: false, 
    isActive: true, 
    created: 2017-11-26, 
    updatedToken: "JWT", 
}; 

으로, user.updatedToken는 당신이 saveToken()에서 만드는 토큰으로 업데이트됩니다. 그것은 ey ... 무언가입니다.

두 번째 인증 후에는 페이로드 내부의 긴 JWT 토큰 ( EY ...를) 추가 :

let payload={ 
    name: "testuser", 
    email: "[email protected]", 
    role: "user", 
    deleted: false, 
    isActive: true, 
    created: 2017-11-26, 
    updatedToken: "ey1232abc456...", 
}; 

user.updatedToken에 저장됩니다 새로운 토큰 페이로드입니다. 이전 토큰을 새 토큰에 저장하고 있습니다.

페이로드 내부에 updatedToken이 있어야합니다.

+0

고맙습니다. 오늘 내 생일 그리고 이것은 최고의 선물, 고마워요))))))))))))))))))))))))))))))) –