如何在使用passport-http Basic + Passport-local组合时防止www-authenticate header

问题描述 投票:0回答:2

您好,我想在我的应用程序中支持基于表单的身份验证和 http 基本身份验证。一切都按预期工作,除非我通过 angularjs 使用错误的凭据使用基于表单的身份验证。

浏览器没有让我的角度代码处理 401,而是显示由 WWW-Authenticate 标头引起的 BASIC 身份验证对话框。

使用本地策略时如何防止添加该标头? 或者我如何以不同的方式支持这两种机制?

我在基于 Express 的应用程序中使用以下路线。

api.post('/authenticate', passport.authenticate(['local', 'basic'], { session: false }), function (req, res) {

这将在该 URL 上启用两种身份验证方法。我再说一遍,当我使用基于表单的错误凭据时,它会向我显示基本身份验证对话框(我不想要那个)。

以下是我注册策略的方法。

passport.use(new BasicStrategy({ realm: 'Authentication failed. Wrong username or password.'}, verifyLocalUser));
passport.use(new LocalStrategy(verifyLocalUser));

这就是我的 verifyUser 方法的样子...

var verifyLocalUser = function (username, password, next) {
    User.findOne({
        username: username
    }).select('fullname admin username password').exec(function (err, user) {
        if (err) {
            return next(err);
        }

        if (user && user.comparePasswords(password)) {
            return next(null, user);
        } else {
            next(null, false, { message: 'Authentication failed. Wrong username or password.' });
        }
    });
}

有谁知道如何使用passport.js支持多种身份验证方法?

为了完整起见,这是验证我身份的角度代码......

authFactory.signIn = function (username, password) {
        return $http.post('/api/authenticate', {
            username: username,
            password: password
        }).then(function (res) {
            AuthToken.setToken(res.data.token);
            return res.data;
        }, function (res) {
            console.warn(res);
        });
    };
angularjs node.js express passport.js passport-local
2个回答
0
投票

而不是这个:

next(null, false, { message: 'Authentication failed. Wrong username or password.' });

您可以使用这个:

cb(new YourCustomError())

“YourCustomError”可以有一条消息,对我来说,我的“YourCustomError”看起来像:

class HttpError extends Error {
  constructor (msg = 'Invalid Request', status = 400) {
    super(msg)
    this.status = status
  }
}

class Forbidden extends HttpError {
  constructor (msg = 'Forbidden') {
    super(msg, 403)
  }
}

或者可能

new Error(<message>)
也适合您


0
投票

要覆盖 Passport-http 的 BasicStrategy 设置 WWW-Authenticate 标头。

BasicStrategy.prototype._challenge = () => 401;

此函数默认返回

'Basic realm="' + this._realm + '"'
,它将 WWW-Authenticate 设置为此值。在 Github 中查看他们的代码

© www.soinside.com 2019 - 2024. All rights reserved.