node.js - 设置 Passport-jwt 身份验证

标签 node.js authentication express passport.js jwt

我在使用 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/

相关文章:

web-services - postman 自定义身份验证

node.js - 连接或Express中间件修改response.body

javascript - NodeJS 到客户端 : large data sending performance

node.js - 将文件复制到剪贴板 Node.JS

c# - 如何在 C# 中编写防火墙自动登录应用程序

node.js - 在nodejs中保存图像的字节数组

javascript - express |异步发出多个http请求

node.js - Socket.io 向套接字发送消息时出错

node.js - 如何在heroku上使用react路由?

Python Kerberos-1.1.1.tar.gz 在 Windows 上安装失败