【问题标题】:Node JS Authentications with passport-jwt unauthorized带有护照-jwt 的节点 JS 身份验证未经授权
【发布时间】:2017-12-20 01:23:10
【问题描述】:

我正在尝试设置我的 Node JS API。

我有一个用户模型:

// Dependencies
var restful = require('node-restful');
var mongoose = restful.mongoose;

var bcrypt = require('bcrypt');

// Schema
var userSchema = new mongoose.Schema({
    username: {
        type: String, 
        required: true, 
        unique: true},
    firstname: {
        type: String, 
        required: true
    },
    lastname: {
        type: String, 
        required: true
    },
    email: {
        type: String, 
        required: true, 
        unique: true,
        lowercase: true
    },
    password: {
        type: String, 
        required: true},
},
{
    timestamps: true
});

// Saves the user's password hashed
userSchema.pre('save', function (next) {  
  var user = this;
  if (this.isModified('password') || this.isNew) {
    bcrypt.genSalt(10, function (err, salt) {
      if (err) {
        return next(err);
      }
      bcrypt.hash(user.password, salt, function(err, hash) {
        if (err) {
          return next(err);
        }
        user.password = hash;
        next();
      });
    });
  } else {
    return next();
  }
});


// Use bcrypt to compare passwords
userSchema.methods.comparePassword = function(pw, cb) {  
  bcrypt.compare(pw, this.password, function(err, isMatch) {
    if (err) {
      return cb(err);
    }
    cb(null, isMatch);
  });
};

module.exports = restful.model('Users', userSchema);

我想使用带 jwt 的护照进行身份验证:

// Dependencies
var JwtStrategy = require('passport-jwt').Strategy;
var ExtractJwt = require('passport-jwt').ExtractJwt;
var config = require('../config/database');

// Load models
var User = require('../models/user');

// Logique d'authentification JWT
module.exports = function(passport) {  
  var opts = {};
  opts.jwtFromRequest = ExtractJwt.fromAuthHeaderWithScheme('JWT');
  opts.secretOrKey = config.secret;
  opts.audience = 'localhost';

  passport.use(new JwtStrategy(opts, function(jwt_payload, done) {
    User.findById(jwt_payload._id, function(err, user) {
      if (err) {
        return done(err, false);
      }
      if (user) {
        done(null, user);
      } else {
        done(null, false);
      }
    });
  }));
  passport.use(new JwtStrategy(opts, function(jwt_payload, done) {
    Company.findById(jwt_payload._id, function(err, company) {
      if (err) {
        return done(err, false);
      }
      if (company) {
        done(null, company);
      } else {
        done(null, false)
      }
    });
  }));
};

还有我的身份验证路线:

// User
router.post('/users/login', (req, res) => {
    User.findOne({
        email: req.body.email
    }, (err, user) => {
        if (err) throw err;

        if (!user) {
            res.json({success: false, message: 'Authentication failed. User not found.'});
        } else {
            // Check if passwords matches
            user.comparePassword(req.body.password, (err, isMatch) => {
                if (isMatch && !err) {
                    // Create token if the password matched and no error was thrown
                    var token = jwt.sign(user, config.secret, {
                        expiresIn: 10080 // in seconds
                      });
                    res.json({success: true, token: 'JWT ' + token, user: {
                        id: user._id,
                        username: user.username,
                        email: user.email
                    }});    
                } else {
                    res.json({success: false, message: 'Authentication failed. Passwords did not match.'});
                }
            });
        }
    });
});

邮递员的一切都很好。 令牌已正确生成并使用用户信息签名。

但我在受保护路由上的身份验证存在问题:

router.get('/users/profile', passport.authenticate('jwt', { session: false }), function(req, res) {  
    res.send('It worked! User id is: ' + req.user._id + '.');
  });

每次,它都会给我一个“未经授权的 401”错误。

我真的不知道问题出在哪里,我认为问题出在 jwtFromRequest 上,我也尝试过 Bearer 但它也不起作用......

【问题讨论】:

  • 您有 2 种相同名称的策略,公司和用户,可能会弄乱护照?我会假设它使用第二个策略,而您期待第一个

标签: node.js authentication passport.js json-web-token


【解决方案1】:

我认为避免此类问题的一个好选择是从使用此身份验证策略的基础项目开始,然后在您完成该工作后,使用您的功能对其进行修改。

这里有一个关于 jwt 身份验证策略和刷新令牌实现的示例:https://solidgeargroup.com/refresh-token-autenticacion-jwt-implementacion-nodejs?lang=es

【讨论】:

    猜你喜欢
    • 2021-07-17
    • 2021-02-16
    • 2016-12-13
    • 2018-03-18
    • 2018-02-04
    • 2018-02-25
    • 2019-06-14
    • 2023-03-21
    • 2017-10-18
    相关资源
    最近更新 更多