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}...`);
});

我需要的是,如果用户执行 post 请求来验证路由,它必须生成令牌并将其提供给变量令牌,而不是在用户每次执行 post 请求时连接。非常感谢你!!!!!!

米卡桑德兰

看起来错误出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有效载荷内部必须去。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用JWTSigner.sign()生成的令牌说jwt.io调试器中的签名无效

来自分类Dev

JWT令牌:注销JWT令牌

来自分类Dev

使用django rest框架jwt将信息添加到JWT令牌主体

来自分类Dev

用lua / openresty验证一个jwt令牌

来自分类Dev

Nest JS添加另一个密钥以使用@ nestjs / jwt刷新令牌

来自分类Dev

Jwt 令牌与访问令牌

来自分类Dev

将自定义验证添加到ASP.NET Core的JWT令牌中?

来自分类Dev

如何将JWT承载令牌添加到对API的所有请求中

来自分类Dev

无法将 jwt 令牌添加到 node.js 响应

来自分类Dev

JWT承载令牌流

来自分类Dev

通过JWT令牌授权

来自分类Dev

是Jwt令牌是UNIQUE

来自分类Dev

传递JWT令牌SockJS

来自分类Dev

JWT令牌如何认证?

来自分类Dev

角JWT刷新令牌

来自分类Dev

JWT提供无效令牌

来自分类Dev

Strapi JWT令牌寿命?

来自分类Dev

是Jwt令牌是UNIQUE

来自分类Dev

通过JWT令牌授权

来自分类Dev

验证 jwt 令牌 [rsa]

来自分类Dev

角度jwt无效令牌

来自分类Dev

刷新过期的 JWT 令牌

来自分类Dev

JWT 令牌存储

来自分类Dev

从 JWT 生成访问令牌

来自分类Dev

在jwt.io上查看JWT令牌

来自分类Dev

django jwt 如何对 jwt 令牌进行签名?

来自分类Dev

在 jwt-auth 中可以为两个模型使用一个令牌吗?

来自分类Dev

网站的Google Sign Flow。IDToken与访问令牌。我需要哪一个?

来自分类Dev

在Volley请求中添加JWT令牌