Ho intenzione di elaborare un po 'su questo, perché è una buona domanda, e c'è molta confusione intorno ad esso - così nudo con me qui.
Se l'API che si sta tentando di proteggere verrà utilizzata esclusivamente da privati per le app lato server e non da sviluppatori di terze parti, mi raccomando, ALTAMENTE, di utilizzare l'autenticazione di base HTTP per proteggere il proprio servizio API .
Il modo in cui funziona è super dritto in avanti:
- per l'utente (s), coppia di generare API Key (s) che consistono di un ID e segreto. Le chiavi API sono sinonimi di username/password. Basta generare valori ID/segreti casuali usando una libreria UUID.
Quando si effettua l'autenticazione con il proprio servizio API, fornire tali credenziali API nell'intestazione Autorizzazione HTTP per identificarsi.Ecco come appare con curl
:
$ ricciolo --user my-api-keyid: my-api-chiave segreta https://api.myservice.com/blah
La cosa fantastica di Auth di base è che:
- È molto semplice da implementare.
- È uno standard ben definito.
- Finché si fanno richieste su HTTPS e non si pubblicizzano le proprie chiavi API, si dovrebbe essere sicuri.
Ora, se si sta creando un servizio API in cui si desidera autenticare gli utenti da una varietà di ambienti (non solo da applicazioni lato server), è necessario utilizzare il protocollo OAuth2.
Questo è ciò per cui è stato progettato.
Il protocollo OAuth2 può autenticare gli utenti in vari modi, ma di conseguenza è piuttosto complicato. L'aggiunta di OAuth per il vostro sito può essere una sfida, anche se si sta utilizzando biblioteche popolari/ecc
Ecco come funziona OAuth (una rapida ripartizione):
La password di Grant
La password flusso in OAuth è dove si scambiano un nome utente/password per un token di accesso (di solito un JWT). Quindi si utilizza il token di accesso nell'intestazione dell'autorizzazione HTTP per identificarsi con il proprio servizio API.
Questo è quello che fa la maggior parte delle persone quando costruisce SPA con Angular/React, così come le app mobili.
Le credenziali client Sovvenzione
Il Cliente flusso Credenziali è dove si scambiano una chiave API (proprio come autenticazione di base) per un token di accesso. Quindi si utilizza il token di accesso nell'intestazione dell'autorizzazione HTTP per identificarsi con il proprio servizio API.
Questo è ciò che le persone fanno quando costruiscono app lato server con OAuth.
The Grant implicito
Questo flusso è ciò che si vede quando si accede in qualche posto come Facebook. Si fa clic su un pulsante, si viene reindirizzati su un altro sito per autenticare/accettare le autorizzazioni e infine si ritorna al sito principale con un token Acccess che si utilizza per identificarsi. Questo NON è l'ideale per i servizi API.
L'autorizzazione Codice di Grant
Questo flusso è esattamente come il flusso implicita, ad eccezione di ottenere di nuovo un codice di autorizzazione che poi cambio di un token di accesso che si utilizza per identificarsi. Questo NON è l'ideale per i servizi API. È leggermente più sicuro.
Se stai pensando di utilizzare OAuth a causa del tuo caso d'uso, ti consiglio vivamente di verificare un provider di autenticazione come Stormpath.Automatizzano molte di queste cose e risolvono molte complessità attorno a OAuth.
Altrimenti, invia Autentica base!
Mi dispiace per la mia risposta in ritardo. Il tuo suggerimento è ottimo e non ho mai pensato ad un'idea così eccellente. Alla fine ho scelto il tipo di concessione della password perché devo implementare anche la nostra app mobile. (forniremo le nostre API agli sviluppatori di app per dispositivi mobili di terze parti) Inoltre, anche OAuth è complicato, ma posso trovare alcune librerie. Questo è anche un bene per me. L'uso dell'autenticazione di base potrebbe richiedere l'implementazione personalizzata, non è sicuro, ma come creare una tabella per il salvataggio di chiavi e segreti generati. – zono
Grazie per la spiegazione, ho alcune domande sulla concessione della password. Ho creato un server di autorizzazione che protegge l'oauth/token con un'autenticazione di base che ha bisogno di client_id e client_secret per accettare le richieste. Ma come posso proteggere il client_secret? Il client è un'app Angular 2. È necessario proteggere oauth/token uri con l'autenticazione di base? – Paolo