设置passport-jwt身份验证

问题描述:

我在使用我的express api服务器时设置passport-jwt时遇到了一些问题。设置passport-jwt身份验证

在前端,我使用ember.js/auth路由发布到应验证会话的凭证,然后ember.js中的库将处理在后续请求中发送令牌。

我跟着this tutorial松散与passport-jwt切换出他们的passport-http相反,在the git repo的例子设置它。

在我server.js我也需要护照,并将其设置为使用app.use(passport.initialize());

server.js文件我打电话给我的API路线与app.use('/api/v1', '/app/routes/api');

app/routes/api.js文件看起来文件的底部中间件有一个章节添加和让用户像这样

router.route('/users') 
    .post(function(req,res) { user.addUser(req,res) }) 
    .get(function(req,res) { user.getAllUsers(req,res) }); 

哪些是在api/user.js文件WHI出口引用CH这个样子

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

module.exports.addUser = function(req, res) { 
    var user = new User(req.body.user); 

    user.save(function(err) { 
    if (err) 
     res.send(err); 
    res.json({user: user}); 
    }); 
}; 

module.exports.getAllUsers = function(req, res) { 
    User.find(function(err, users) { 
     if (err) { 
     res.send(err); 
     } 
     res.json({users: users}); 
    }); 
}; 

该模型是相当直接的,它试图散列密码上的保存提供它并没有改变(我假设这是PUT请求)与密码验证类方法沿

var mongoose = require('mongoose'); 
var bcrypt = require('bcrypt-nodejs'); 

var UserSchema = new mongoose.Schema({ 
    username: { 
     type: String, 
     unique: true, 
     required: true 
    }, 
    password: { 
     type: String, 
     required: true 
    } 
}); 

UserSchema.pre('save',function(callback){ 
    var user = this; 

    if(!user.isModified('password')) return callback(); 

    bcrypt.genSalt(5, function(err, salt){ 
     if (err) return callback(err); 

     bcrypt.hash(user.password, salt, null, function(err, hash){ 
      if (err) return callback(err); 
      user.password = hash; 
      callback(); 
     }); 
    }); 
}); 

UserSchema.methods.verifyPassword = function(password) { 
    return bcrypt.compareSync(password, this.local.password); 
}; 

module.exports = mongoose.model('User',UserSchema); 

对于我的其他API端点我传递我isAuthenticated方法从controllers/auth.js像这样

router.route('/followers') 
    .post(authController.isAuthenticated, function(req,res) { follower.addFollower(req,res) }) 
    .get(authController.isAuthenticated, function(req,res) { follower.getAllFollowers(req,res) }); 

,出口在控制器文件看起来像

var dotenv = require('dotenv'); 
dotenv.load(); 

var passport = require('passport'); 
var JWTStrategy = require('passport-jwt').Strategy; 
var User = require('../models/user'); 

var opts = {}; 
opts.secretOrKey = process.env.PASSPORT_SECRET || 'secretsauce'; 
passport.use(new JWTStrategy(opts, function(jwt_payload, done){ 
    User.findOne({id: jwt_payload.sub}, function(err, user){ 
     if (err) { 
      return done(err, false); 
     } 
     if (!user) { return done(null,false); } 
     user.verifyPassword(password, function(err,isMatch){ 
      if (err) { return done(err, false); } 
      if(!isMatch) { return done(null,false); } 
      done(null, user); 
     }); 
    }); 
})); 

exports.isAuthenticated = passport.authenticate('jwt', { session : false }); 

我觉得这个区域是我越来越对我也应该有明确的服务器进行身份验证混淆。我可以添加用户并且他们的密码正确地被哈希,但我怎么才能真正地验证用户。具体如何去授权他们在POST/auth路线?我使用邮递员来测试API,所以如果有人可以解释如何使用邮递员中的jwt进行测试,那很酷。我知道我必须为通过身份验证获得的令牌设置标头,但我坚持了解如何进行身份验证。

+1

我相信'passport-jwt'只在你已经拥有一个令牌的情况下才有效。您可能应该使用eg添加身份验证端点。 'passport-local',通过他们的用户名和密码验证用户,并为他们提供令牌。一旦你有了令牌,你只需将它传递给头文件,'passport-jwt'将处理其余的内容。 – vesse

+0

啊好的,这可能解释了我在一些教程中看到的一些东西,其中包含了一些模块,但我并不真正了解它们被包含的方式或原因。 – Jordan

在你的路线中,你应该包括passport.authenticate函数来检查是否有一个有效的标记。