设置passport-jwtauthentication

我用express API设置passport-jwt时遇到了一些麻烦。

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

我松散地遵循了这个教程 ,而是用passport-jwtreplace了他们的passport-http ,并在git回购中用例子来设置它。

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

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

 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请求)以及密码validation类的方法

 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端点,我从controllers/auth.js传入isAuthenticated方法

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

我认为这个领域是我对我应该如何与快递服务器进行authentication感到困惑的地方。 我可以添加用户和他们的密码正在哈希正确,但我怎么实际身份validation用户。 具体来说,我将如何去授权他们在POST/auth路由? 我正在使用邮递员testingAPI,所以如果有人可以解释如何testing一个邮递员,这将是很酷的jwt。 我知道我必须设置一个标题,我从authentication得到的令牌,但我坚持了解如何进行身份validation。

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