我是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;
任何人都可以给我任何关于我在这里缺少什么的线索吗?
答案 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
作为集合。