如何在使用护照-http Basic +护照 – 本地组合时防止www-authenticate头

您好,我想支持我的应用程序中的基于身份的身份validation和http基本身份validation。 一切工作如预期,除非当我使用基于窗体的身份validation通过angularjs凭证错误。

浏览器显示由WWW-Authenticate头引起的BASIC auth对话框,而不是让我的angular码处理401。

如何防止在使用本地策略时添加标题? 或者我怎样才能以不同的方式支持这两种机制?

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

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

这将启用该url上的两种身份validation方法。 我再说一遍,当我使用错误的证书使用formbased它显示我基本的身份validation对话框(我不希望这一点)。

以下是我如何注册的战略。

 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支持多种身份validation方法?

为了完整性,这是validation我的angular码

 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); }); }; 

而不是这个:

 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>)也适用于您