2015-08-06 9 views
5

Witam Chcę obsługiwać zarówno uwierzytelnianie w formie formalnej, jak i uwierzytelnianie podstawowe http w mojej aplikacji. Wszystko działa zgodnie z oczekiwaniami, z wyjątkiem sytuacji, gdy korzystam z autorskiego formularza za pośrednictwem angularjs z błędnymi danymi uwierzytelniającymi.jak zapobiec nagłówkowi uwierzytelniania www podczas korzystania z uwierzytelniania paszport-http Basic + paszport-lokalny

Zamiast mojego kodu kanciastego obsłużyć 401, przeglądarka pokazuje okno dialogowe uwierzytelniania BASIC, spowodowane przez nagłówek WWW-Authenticate.

Jak zapobiec dodawaniu tego nagłówka podczas używania strategii lokalnej? Albo w jaki sposób mogę wesprzeć oba mechanizmy w inny sposób?

Używam poniższej trasy w mojej aplikacji ekspresowej.

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

Umożliwia włączenie obu metod uwierzytelniania dla tego adresu URL. Powtarzam, kiedy używam złych poświadczeń używając formbased, pokazuje mi to podstawowe okno dialogowe auth (nie chcę tego).

Oto jak zarejestrowałem strategie.

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

To jest jak moja metoda verifyUser wygląda ...

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

Czy ktoś wie, jak obsługiwać wiele metod uwierzytelniania z wykorzystaniem passport.js?

Dla kompletności, jest to kod, który mnie kanciasty uwierzytelnia ...

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

Odpowiedz

0

zamiast tego:

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

Można to wykorzystać:

cb(new YourCustomError()) 

A " YourCustomError "może mieć wiadomość, dla mnie moja" YourCustomError "wygląda tak:

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

Albo prawdopodobnie new Error(<message>) będzie działać poprawnie za ciebie, za

Powiązane problemy