设置passport-jwt身份验证

时间:2015-10-05 20:24:30

标签: node.js authentication express passport.js jwt

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

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

我松散地跟踪了this tutorial并将passport-http改为passport-jwt,而是使用the git repo中的示例进行设置。

在我server.js我需要护照并使用app.use(passport.initialize());

将其设置为中间件

server.js文件的底部,我使用app.use('/api/v1', '/app/routes/api');调用我的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文件中对导出的引用如下所示

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 个答案:

答案 0 :(得分:2)

在您的路线中,您应该包括passport.authenticate函数,以检查是否有有效的令牌。