2017-11-26 14 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を実行している場合トークンを生成して変数トークンに渡す必要があります。ユーザーがポストリクエストを行うたびに連結する必要はありません。 ありがとうございます!!!!!!

+0

try:findOneAndUpdate(query、{$ set:updateToken}、callback) –

+0

私はしようとしましたが、問題はjwt.sign()メソッドから来て、トークンをユーザが投稿要求を行い、 jwt.sign()メソッドの値ですが、以前のすべてのpost要求値を受け取り、それらをすべて連結します。お返事ありがとう))))))) –

+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()で作るトークンで更新されます。それはです...何か。

第二の認証後には、ペイロード内の長い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

ありがとうございました。今日私の誕生日とこれは最高の贈り物です))))))))))))))))))))))))))))))))))))))) –

関連する問題