设置passport-jwtauthentication
我用express
API设置passport-jwt
时遇到了一些麻烦。
在前端,我使用ember.js
发送到/auth
路由应validation会话的凭证,然后ember.js
的库将处理在随后的请求中发送令牌。
我松散地遵循了这个教程 ,而是用passport-jwt
replace了他们的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函数,检查是否有一个有效的令牌。