我在使用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。我知道我必须为我从验证中获得的令牌设置一个标题,但我不知道如何验证。
答案 0 :(得分:2)
在您的路线中,您应该包括passport.authenticate函数,以检查是否有有效的令牌。