Dove eseguire l'autenticazione nel server REST API?

4

Sto lavorando su un set di API REST che devono essere protette in modo che vengano eseguite solo le chiamate autenticate. Ci saranno più app web per servire queste API. Esiste un approccio best-practice su dove dovrebbe avvenire l'autenticazione?

Ho pensato a due possibili posti.

  1. Chiedi a ciascuna app Web di eseguire l'autenticazione utilizzando un servizio di autenticazione condiviso. Questo sembra essere in linea con strumenti come Spring Security, che è configurato a livello di app Web.

  2. Proteggi ogni app Web con un "gateway" per sicurezza. In questo approccio, l'app Web non riceve mai chiamate non autenticate. Questo sembra essere l'approccio dell'Autenticazione Server HTTP Apache. Con questo approccio, useresti Apache o nginx per proteggerlo, o qualcos'altro tra Apache / nginx e la tua app web?

Per ulteriore riferimento, l'autenticazione è simile a servizi come AWS che hanno un identificatore non segreto combinato con una chiave segreta condivisa. Sto anche pensando di usare HMAC. Inoltre, stiamo scrivendo i servizi web in Java usando Spring.

Aggiornamento: per chiarire, ogni richiesta deve essere autenticata con l'identificatore e la chiave segreta. Questo è simile a come funzionano le richieste di REST di AWS.

    
posta David V 15.07.2013 - 18:36
fonte

2 risposte

2

È una questione di separazione delle preoccupazioni . In un caso, un provider di identità dedicato (IDP) esegue l'autenticazione e fornisce un token di accesso, che viene verificato da tutte le applicazioni Web prima che un utente (o un'applicazione) possa eseguire un'operazione. Nell'altro caso, ogni applicazione Web deve eseguire tale autenticazione (anche se condivide lo stesso codice base).

Le implicazioni sono importanti esp. per il consumo del codice:

  • Se esiste un solo fornitore di identità, un utente (o il codice che consuma) verrà in genere autenticato una sola volta e il token di accesso potrà quindi essere fornito a tutte le applicazioni Web necessarie. Ciò consente il Single Sign-On (SSO) da implementare su più domini (si consideri il caso in cui un utente accede una volta a Facebook e quindi non deve fornire le credenziali per ogni sito che utilizza l'autenticazione FB.)
  • Dato che esiste un IDP, tutta l'esperienza utente in merito agli accessi è molto più facile da gestire. Ad esempio, un utente accede a un'applicazione Web, reindirizza all'IDP per accedere. I casi come l'utente che dimentica il nome utente, o la password, o hanno qualche prerequisito mancante sulla loro macchina possono essere gestiti da questo servizio comune. Nel caso di ogni applicazione Web che fa ciò, in qualche modo l'esperienza dell'utente di autenticazione deve essere esposta attraverso ogni applicazione web, che è fattibile, ma più difficile da gestire.
  • Esistono già protocolli consolidati che è possibile utilizzare per tali scenari (ad esempio OAUTH ), il che significa che è possibile utilizzare un IDP esterno (ora o in futuro) che supporta gli stessi protocolli senza cambiare la tua applicazione molto.
  • Dal momento che le specifiche di tali protocolli sono standardizzate, c'è una maggiore possibilità che si ottenga la sicurezza, dal momento che importanti parametri sono forzati nel protocollo (sebbene ci siano ancora vulnerabilità che è necessario gestire, ad esempio OAUTH è soggetto a CSRF attacca come esempio).

Il vantaggio di ciascuna applicazione Web che esegue l'autenticazione è:

  • L'implementazione iniziale di solito costa meno, perché non si ha a che fare con la creazione di token di accesso e il loro trasferimento e convalida. Una volta passate le credenziali a un'applicazione Web, è possibile effettuare una chiamata interna a una libreria (o servizio) comune per convalidare le credenziali. Di solito, i framework di sviluppo web forniscono già alcune funzionalità per ottenerli, quindi il costo è spesso molto basso.
  • Se tutte le tue app sono su un dominio (e puoi utilizzare i cookie per il Single Sign-On), è un'esperienza utente molto più pulita (ma non appena hai due o più domini, l'esperienza utente diventa difficile specialmente quando non esiste un unico accesso.)

Amazon, Microsoft, Facebook, Google, ecc., tutti utilizzano un servizio dedicato perché i professionisti sono molto più importanti per i loro utenti e utilizzano applicazioni rispetto al costo di implementazione. Inoltre, dispongono di team dedicati che lavorano su funzioni di autenticazione come reimpostazioni automatizzate delle password, autenticazione a più fattori, accesso API, oltre all'implementazione di protocolli più recenti e al miglioramento di quelli esistenti, esp. in termini di sicurezza.

[Disclaimer: lavoro in Microsoft in Active Directory e nel gruppo Sicurezza. Le opinioni sono mie e ho fatto il massimo sforzo per rendere questa tecnologia agonistica dal momento che si tratta di una domanda di design.]

    
risposta data 11.06.2014 - 07:29
fonte
1

La maggiore preoccupazione IMHO è la facilità d'uso da parte degli sviluppatori, pertanto, supponendo che si stia pubblicando un SDK o una libreria come complimento alla propria API, è possibile proteggere le chiamate di un client in vari modi purché sia semplice per lo sviluppatore. Ma forse è ovvio?

Detto questo, penso che il modo più semplice sia HMAC. Ciò fornisce sia i mezzi per l'autenticazione, ma anche i mezzi con cui è possibile verificare l'integrità del contenuto del messaggio / carico utile. Inoltre, è un approccio abbastanza comune in base al quale la maggior parte degli sviluppatori può trovare un sacco di codice di esempio per implementarlo praticamente su qualsiasi piattaforma.

La domanda che potrei chiederti in cambio è, quali sono i dati che devi proteggere? Esistono standard di settore ai quali dovresti conformarti?

In caso contrario, solo l'autenticazione HTTP Basic su HTTPS, o semplicemente il passaggio di parametri username / password insieme alla richiesta su HTTPS, potrebbe essere sufficiente (ben sapendo che questa non è la forma più sicura di autenticazione olistica). Sapendo che, se questo è insufficiente per i tuoi clienti, puoi sempre aggiungere ulteriori forme di autenticazione lungo la strada.

    
risposta data 19.07.2013 - 17:54
fonte

Leggi altre domande sui tag