使用passport-http Basic + passport-local组合时如何防止www-authenticate header
Posted
技术标签:
【中文标题】使用passport-http Basic + passport-local组合时如何防止www-authenticate header【英文标题】:howto prevent www-authenticate header when using passport-http Basic + passport-local combination 【发布时间】:2015-10-29 12:15:04 【问题描述】:您好,我想在我的应用程序中同时支持基于表单的身份验证和 http 基本身份验证。一切都按预期工作,除非我通过带有错误凭据的 angularjs 使用基于表单的身份验证。
浏览器没有让我的 Angular 代码处理 401,而是显示由 WWW-Authenticate 标头引起的 BASIC 身份验证对话框。
如何防止在使用本地策略时添加该标头? 或者我怎样才能以不同的方式支持这两种机制?
我在基于快递的应用程序中使用以下路线。
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);
);
;
【问题讨论】:
【参考方案1】:而不是这个:
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>)
可能也适合你
【讨论】:
以上是关于使用passport-http Basic + passport-local组合时如何防止www-authenticate header的主要内容,如果未能解决你的问题,请参考以下文章