我在使用我的express应用程序接口服务器设置passport-jwt时遇到了一些问题。
在前端,我使用ember.js向/auth路由发送应该对会话进行身份验证的凭据,然后ember.js中的库将处理在后续请求中发送令牌。
我松散地跟踪了this tutorial,并用passport-jwt替换了他们的passport-http,用the git repo设置了它。
在我的server.js中,我需要passport,并使用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端点,我从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 });我想这就是我在如何向express服务器进行身份验证时感到困惑的地方。我可以添加用户,他们的密码被正确地散列,但我如何实际验证用户。具体地说,我该如何在到/auth路由的POST上授权它们?我正在使用postman来测试API,所以如果有人可以解释一下如何在postman中使用jwt进行测试,那将会很酷。我知道我必须为从身份验证中获得的令牌设置一个头,但我无法理解如何进行身份验证。
发布于 2016-05-09 13:26:24
在您的路由中,您应该包括检查是否存在有效令牌的passport.authenticate函数。
https://stackoverflow.com/questions/32957286
复制相似问题