用户在使用护照js进行身份验证时将其作为null

时间:2016-03-10 19:27:37

标签: node.js mongodb authentication express 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;

任何人都可以给我任何关于我在这里缺少什么的线索吗?

2 个答案:

答案 0 :(得分:0)

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

值得指出的是,除非您在回复后需要进行清理程序,否则应使用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,
  });
};

答案 1 :(得分:0)

我解决了。问题是我将集合名称设为UserSchema,而我的模型名称为User。正如mongoose docs here中所述:

  

Mongoose会自动查找模型的复数版本   名称

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