2013-03-15 11 views
6

Sto implementando un'API RESTful con Express in Node e sono nuovo per entrambi. Mi piacerebbe utilizzare l'autenticazione di base per controllare l'accesso.È possibile applicare l'autenticazione di base/il middleware nei percorsi con una whitelist in Express?

Mi piacerebbe applicarlo utilizzando qualcosa come una lista bianca, ma non sono sicuro di come farlo.

Liste nere è facile, posso solo Pepe La mia #VERB chiamate con il secondo argomento:

app.get('/', asyncAuth, requestHandler); 

posso prendere che anche oltre e blacklist tutto con:

app.all('*', asyncAuth, requestHandler); 

Ma io voglio applicare il mio basicAuth su ogni singola route, eccetto per POST /users. C'è un modo elegante per farlo? Posso utilizzare l'approccio "lista nera" per rimuoverlo in modo selettivo dalle rotte che desidero? Non riuscivo a capire come.

+1

domanda interessante, credo che la tua domanda è più di "Come seleziona un percorso negativo ", cioè, abbina con garbo ogni percorso tranne alcuni percorsi espressi. Puoi provare i percorsi di corrispondenza con espressioni regolari e negare "/ utenti", ad esempio http://stackoverflow.com/questions/6586197/expressjs-bind-all-routes-except-2-folders? –

+0

Grazie! Stavo avendo problemi a formularlo. Selezionare una rotta negativa è quello che mi piacerebbe fare. Ho pensato di usare una regex, avrebbe funzionato, ma sembrava un po 'un hack. Sembra che ci dovrebbe essere un modo migliore. – Terraflubb

risposta

8

Definire il percorso per POST /users prima che i percorsi nella lista nera:

app.post('/users', function(req, res) { 
    ... 
}); 

app.all('*', asyncAuth, requestHandler); 
+0

Non riesco a credere che fosse così semplice e non mi è venuto in mente! Grazie, ho apportato questa modifica e tutti i miei test sono ecologici. – Terraflubb

2

Si potrebbe mantenere un elenco di espressioni regolari che sono nella whitelist, e abbinare l'url contro l'url nella lista, se corrisponde a qualsiasi quindi procedere, altrimenti richiedono autenticazione

app.all('*', asyncAuth); 

function asyncAuth(req, res, next) { 
    var done = false; 
    whitelist.forEach(function(regexp) { 
     if (req.url.match(regexp)) { 
      done = true; 
      next(); 
     } 
    }); 
    if (!done) requireAuth(next); 
} 

qualcosa del genere

+0

Sì! Quello funzionerebbe. Stavo usando 'express.basicAuth (funzione (username, password) {...}' esclusivamente, quindi ho pensato che non avrei avuto accesso a 'req'. Questo è un trucco pulito Lo contrassegnerò come la soluzione a meno che qualcuno sappia come farlo senza questo tipo di soluzione alternativa: – Terraflubb

Problemi correlati