使用护照 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
作为一个集合。
我是 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 和控制台
中显示为 nullRuntime.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
作为一个集合。