2015-08-06 12 views
5

Ciao Voglio supportare sia l'autenticazione basata su form che l'autenticazione di base http nella mia app. Tutto funziona come previsto tranne quando utilizzo l'autenticazione basata su modulo tramite angularjs con credenziali errate.come impedire l'intestazione di www-authenticate quando si utilizza la combinazione passport-http Basic + passport-local

Invece di avere il mio codice angolare per gestire il 401, il browser mostra la finestra di dialogo di autenticazione BASIC, causata dall'intestazione dell'autenticazione WWW.

Come posso evitare che l'intestazione venga aggiunta quando viene utilizzata la strategia locale? O come posso supportare entrambi i meccanismi in un modo diverso?

Io uso il seguente percorso nella mia app basata su espresso.

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

Ciò abilita entrambi i metodi di autenticazione su tale URL. Ripeto, quando uso credenziali errate usando formbased mi mostra la finestra di dialogo di autenticazione di base (non lo voglio).

Di seguito è riportato come ho registrato le strategie.

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

Ecco come il mio metodo verifyUser sembra ...

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

Qualcuno sa come sostenere più metodi di autenticazione che utilizzano passport.js?

Per completezza, questo è il codice angolare che mi autentica ...

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

risposta

0

invece di questo:

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

È possibile utilizzare questo:

cb(new YourCustomError()) 

E " YourCustomError "può avere un messaggio, per me il mio" YourCustomError "assomiglia a:

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

O probabilmente new Error(<message>) funzionerà correttamente anche per te

Problemi correlati