使用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的主要内容,如果未能解决你的问题,请参考以下文章

PAT Basic 1051

PAT Basic 1013

PAT Basic 1030

PTA(Basic Level)1030.完美数列

PAT Basic 1030 完美数列 (25 分)

[PAT Basic] 1007.素数对猜想