节点JS身份验证与护照-Jwt未经授权

问题描述:

我试图设置我的节点JS API。节点JS身份验证与护照-Jwt未经授权

我有一个用户模式:

// Dependencies 
var restful = require('node-restful'); 
var mongoose = restful.mongoose; 

var bcrypt = require('bcrypt'); 

// Schema 
var userSchema = new mongoose.Schema({ 
    username: { 
     type: String, 
     required: true, 
     unique: true}, 
    firstname: { 
     type: String, 
     required: true 
    }, 
    lastname: { 
     type: String, 
     required: true 
    }, 
    email: { 
     type: String, 
     required: true, 
     unique: true, 
     lowercase: true 
    }, 
    password: { 
     type: String, 
     required: true}, 
}, 
{ 
    timestamps: true 
}); 

// Saves the user's password hashed 
userSchema.pre('save', function (next) { 
    var user = this; 
    if (this.isModified('password') || this.isNew) { 
    bcrypt.genSalt(10, function (err, salt) { 
     if (err) { 
     return next(err); 
     } 
     bcrypt.hash(user.password, salt, function(err, hash) { 
     if (err) { 
      return next(err); 
     } 
     user.password = hash; 
     next(); 
     }); 
    }); 
    } else { 
    return next(); 
    } 
}); 


// Use bcrypt to compare passwords 
userSchema.methods.comparePassword = function(pw, cb) { 
    bcrypt.compare(pw, this.password, function(err, isMatch) { 
    if (err) { 
     return cb(err); 
    } 
    cb(null, isMatch); 
    }); 
}; 

module.exports = restful.model('Users', userSchema); 

我想使用的护照与智威汤逊认证:

// Dependencies 
var JwtStrategy = require('passport-jwt').Strategy; 
var ExtractJwt = require('passport-jwt').ExtractJwt; 
var config = require('../config/database'); 

// Load models 
var User = require('../models/user'); 

// Logique d'authentification JWT 
module.exports = function(passport) { 
    var opts = {}; 
    opts.jwtFromRequest = ExtractJwt.fromAuthHeaderWithScheme('JWT'); 
    opts.secretOrKey = config.secret; 
    opts.audience = 'localhost'; 

    passport.use(new JwtStrategy(opts, function(jwt_payload, done) { 
    User.findById(jwt_payload._id, function(err, user) { 
     if (err) { 
     return done(err, false); 
     } 
     if (user) { 
     done(null, user); 
     } else { 
     done(null, false); 
     } 
    }); 
    })); 
    passport.use(new JwtStrategy(opts, function(jwt_payload, done) { 
    Company.findById(jwt_payload._id, function(err, company) { 
     if (err) { 
     return done(err, false); 
     } 
     if (company) { 
     done(null, company); 
     } else { 
     done(null, false) 
     } 
    }); 
    })); 
}; 

我的认证路线:

// User 
router.post('/users/login', (req, res) => { 
    User.findOne({ 
     email: req.body.email 
    }, (err, user) => { 
     if (err) throw err; 

     if (!user) { 
      res.json({success: false, message: 'Authentication failed. User not found.'}); 
     } else { 
      // Check if passwords matches 
      user.comparePassword(req.body.password, (err, isMatch) => { 
       if (isMatch && !err) { 
        // Create token if the password matched and no error was thrown 
        var token = jwt.sign(user, config.secret, { 
         expiresIn: 10080 // in seconds 
         }); 
        res.json({success: true, token: 'JWT ' + token, user: { 
         id: user._id, 
         username: user.username, 
         email: user.email 
        }});  
       } else { 
        res.json({success: false, message: 'Authentication failed. Passwords did not match.'}); 
       } 
      }); 
     } 
    }); 
}); 

一切工作的伟大邮递员。 令牌已正确生成并使用用户信息进行签名。

但是我有一个受保护的航线上验证了一个问题:

router.get('/users/profile', passport.authenticate('jwt', { session: false }), function(req, res) { 
    res.send('It worked! User id is: ' + req.user._id + '.'); 
    }); 

每次,它给了我一个“未经授权401”错误。

我真的不知道哪里出了问题,我认为这个问题是各地jwtFromRequest,我也试图与承载,但它也不起作用......

+0

你具有相同的名称,公司和用户2分的策略,也许这弄乱了护照?我会假设它在你期待第一个时使用第二个策略 –

我觉得一个很好的选择,以避免这种问题是从使用此身份验证策略的基础项目开始,在您运行之后,使用您的功能对其进行修改。

在这里,你有智威汤逊的验证策略和刷新令牌上实施的实例:https://solidgeargroup.com/refresh-token-autenticacion-jwt-implementacion-nodejs?lang=es