Passport-http错误的请求

我想用passport-http(DigestStrategy)进行简单的身份validation。 它看起来像:

var DigestStrategy = require('passport-http').DigestStrategy; passport.use('login', new DigestStrategy({ qop: 'auth' }, function(login, password, done) { User.findOne({ login: login }, function(err, user) { if (err) { return done(err); } if (!user) { return done(null, false); } user.matchPassword(password, function(err, isMatch) { if (!isMatch) { return done(null, false); } return done(null, user); }) }); } )); 

并在POST /login

 router.post('/', passport.authenticate('login', {session: false}), function(req, res) { if (req.user) { var expires = moment().add('hours', 1).valueOf(); res.json({ expires: expires, user: req.user.toJSON() }); } else { console.log("send 401 ..."); res.sendStatus(401); } }); 

我以httpforms插入凭据

 div.loginbox form(name='login', action='/login', method='post') label(value='login') input(type='text', name='login') label(value='password') input(type='password', name='password') input(type='submit', value='Login') 

但之后,我只收到了400个错误的请求。

实际上,通过将表单数据作为凭证发布,您正在混合一些HTTP身份validation和自定义身份validation

通过使用HTML表单发布凭证,不存在隐式的HTTP摘要authentication。 您需要发送一些特殊的头文件来启动任何HTTP身份validation。 在那里你可以select基本摘要authentication。 这导致浏览器提示用户input名称和密码,从而产生特殊的HTTP头,然后由选定的DigestStrategy进行pipe理。 错误的请求发出的HTTP标头实际上缺less执行身份validation所需的标头信息。

如果你想使用表单login,你可能要使用Passport-Local的LocalStrategy,或者可能使用AJAX来pipe理客户端摘要authentication,虽然我会坚持使用前者。

作为替代scheme,您可以使用也具有护照集成function的http-auth :

 // Authentication module. var auth = require('http-auth'); var digest = auth.digest ({ realm: "Simon Area.", file: __dirname + "/../data/users.htdigest" // gevorg:gpass, Sarah:testpass ... }); // Application setup. var app = express(); // Setup strategy. var passport = require('passport'); passport.use(auth.passport(digest)); // Setup route. app.get('/', passport.authenticate('http', { session: false }), function(req, res) { res.end("Welcome to private area - " + req.user + "!"); });