使用护照 js 进行身份验证时,用户为空

User coming as null while authenticating with passport js

我是 Node/mongodb/passport 的新手,正在尝试使用护照进行身份验证。 这是我的 auth.js

var User = require('../models/userModel'),
  passport = require('passport'),
  BasicStrategy = require('passport-http').BasicStrategy,
  jwt = require('jsonwebtoken');

passport.use(new BasicStrategy(function(userid, password, done){
  User.findOne({ 'userid': userid }, function(err, user){
    if(err){ 
      return done(err); 
    }

    if(!user){ 
      return done(null, false); 
    }

    if(!user.verifyPassword(password)){ 
      return done(null, false);
    }

   return done(null, user);
  })
}));

exports.generateToken = function(req, res, next){
  req.token = jwt.sign({ id:req.user.userid },'secret key', { expiresInMinutes:120 });
  next();
};

exports.respond = function(req, res){
  req.status(200).json({
    user: req.user,
    token:req.token
  });
};

exports.isAuthenticated = passport.authenticate('basic', {session:false});

对于数据库,我简单的创建了一个用户来测试:

db.UserSchema.insert({"userid": "hm", "password":"mm123"})

这是我的 userModel.js

var mongoose = require('mongoose'),
  bcrypt = require('bcrypt-nodejs');

var UserSchema = new mongoose.Schema({
  userid: {
    type: String,
    unique: true,
    required: true
  },
  password: {
    type: String,
    required: true
  },
  access_token: String
});


UserSchema.methods.verifyPassword = function(password, cb) {
  bcrypt.compare(password, this.password, function(err, isMatch) {
    if (err) return cb(err);
    cb(null, isMatch);
  });
};
module.exports = mongoose.model('User', UserSchema);

当我使用 postman 发送请求并使用 node-inspector 进行调试时,用户在 auth.js 和控制台

中显示为 null
Runtime.getProperties failed.
Error: No scopes

这里是server.js

var express = require('express'),
    mongoose = require('mongoose'),
    bodyParser = require('body-parser'),
    path = require('path'),
    passport =require('passport'),
    authentication = require('./auth/auth');


var db;
if (process.env.ENV == 'Test') {
  db = mongoose.connect('mongodb://localhost/fxtest');
}else{
  db = mongoose.connect('mongodb://localhost/fx');
}

var app = express();

var port = process.env.PORT || 3000;

app.listen(port, function(){
  console.log('Running on Port using gulp:', port);
});
app.use(passport.initialize());
app.post('/auth',authentication.isAuthenticated,
 authentication.generateToken, authentication.respond);
module.exports = app;

谁能告诉我我在这里遗漏了什么?

您正在使用您无法执行的请求对象进行响应。您需要在响应对象上进行响应。

还值得指出的是,除非您有一个需要在您响应后进行的清理程序,否则您应该将 return 与您的 res 对象一起使用。

exports.respond = function(req, res){

  // This is wrong
  req.status(200).json({ 
    user: req.user,
    token:req.token
  });

  // This is correct
  return res.status(200).json({
    user: req.user,
    token: req.token,
  });
};

我解决了。问题是我将集合名称命名为 UserSchema,而我的模型名称是 User。正如猫鼬文档中所述 here:

Mongoose automatically looks for the plural version of your model name

所以它正在寻找 users 作为一个集合。