Passport-http错误请求

时间:2015-07-05 13:36:29

标签: node.js passport.js

我想用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。

2 个答案:

答案 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 + "!");
});