我在使用 express
API 服务器设置 passport-jwt
时遇到一些问题。
在前端,我使用 ember.js
将应验证 session 的凭据发布到 /auth
路由,然后将验证 中的库ember.js
将处理在后续请求中发送 token 。
我关注了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) });
Controller 文件中的导出看起来像
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 服务器进行身份验证感到困惑的地方。我可以添加用户,并且他们的密码已正确散列,但我如何实际验证用户身份。具体来说,我将如何在 POST
上授权它们到 /auth
路由?我正在使用 postman 来测试 API,所以如果有人可以解释如何在 postman 中使用 jwt 进行测试,那就太酷了。我知道我必须为通过身份验证获得的 token 设置 header ,但我一直无法理解如何进行身份验证。
最佳答案
在您的路由中,您应该包含 Passport.authenticate 函数来检查是否存在有效 token 。
关于node.js - 设置 Passport-jwt 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32957286/