我想用passport-http(DigestStrategy)进行简单的身份验证。 看起来像是:
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);
}
});
我在http表单中插入凭据
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 Bad Request。
答案 0 :(得分:0)
实际上,您通过将表单数据作为凭据发布来混合一些HTTP身份验证和自定义身份验证。
通过使用HTML表单发布凭据,没有隐式HTTP摘要身份验证。您需要发送一些特殊标头来启动任何HTTP身份验证。在那里,您可以选择基本或摘要身份验证。这导致浏览器提示用户输入名称和密码,从而产生特殊的HTTP标头,然后由选择的DigestStrategy管理。为HTTP标头发出的错误请求实际上缺少执行身份验证所需的标头信息。
如果您想使用表单登录,您可能希望使用本地护照的LocalStrategy,或者可能使用AJAX自行管理客户端摘要身份验证,但我会坚持使用前者。
答案 1 :(得分:0)
作为替代方案,您可以使用也具有护照集成的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 + "!");
});