2015-08-06 10 views
5

Hallo Ich möchte sowohl formbasierte Authentifizierung und HTTP-Authentifizierung in meiner App unterstützen. Alles funktioniert wie erwartet, außer wenn ich Formular-basierte Authentifizierung über angularjs mit falschen Anmeldeinformationen verwende.howto verhindern www-authenticate header bei der Verwendung von Pass-http Basic + Pass-lokale Kombination

Anstatt, dass mein Winkelcode den 401 handhabt, zeigt der Browser den BASIC-Auth-Dialog, verursacht durch den WWW-Authenticate-Header.

Wie kann ich verhindern, dass dieser Header hinzugefügt wird, wenn die lokale Strategie verwendet wird? Oder wie kann ich beide Mechanismen auf andere Weise unterstützen?

Ich benutze die folgende Route in meiner Express-basierten App.

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

Dies aktiviert beide Authentifizierungsmethoden für diese URL. Ich wiederhole, wenn ich falsche Anmeldeinformationen benutze, die formbasiert sind, zeigt es mir den grundlegenden Authentifizierungsdialog (ich will das nicht).

Im Folgenden ist, wie ich die Strategien registriert.

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

Dies ist, wie meine VerifyUser Methode wie ...

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.' }); 
     } 
    }); 
} 
sieht

Wer weiß, wie mit passport.js mehrere Authentifizierungsmethoden unterstützen?

Der Vollständigkeit halber ist dies der Winkel Code, der mich authentifiziert ...

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

Antwort

0

statt dessen:

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

Sie diese verwenden können:

cb(new YourCustomError()) 

Und " YourCustomError "kann eine Nachricht haben, für mich" YourCustomError "sieht so aus:

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

Oder wahrscheinlich new Error(<message>) wird richtig für Sie arbeiten, zu

Verwandte Themen