Sto implementando un'API e un'app Web sul lato client, che dovrebbero comunicare tramite un'API e utilizzare OAuth 2 per l'autenticazione.
Non riesco a superare la mia confusione su quale sia il modo giusto per autenticare gli utenti (ad esempio senza importanti problemi di sicurezza).
Ho raccolto quanto segue:
- Idealmente, dovresti esporre un modulo web sul server API che accetta nome utente e password e reindirizza con un codice di autorizzazione, da scambiare sul lato client per un token di accesso token di accesso.
- L'approccio che ho descritto è considerato ingombrante, quindi OAuth 2 offre un flusso implicito in cui l'app lato client effettua una richiesta contenente un
client_id
e le credenziali dell'utente, che raccoglie. Riceve un token di accesso. - Gli strumenti di autenticazione sembrano essere cauti nel consentire solo il passaggio di
client_id
e invece richiede l'inclusione diclient_secret
. - In base al punto precedente, come sviluppatore potresti dover incorporare il
client_secret
nell'applicazione distribuibile, rendendolo così pubblico. - Alcuni peer con una comprensione di OAuth 2 mi hanno detto che non è raro che gli sviluppatori incorporino il
client_secret
nelle loro distribuzioni e che alcuni servizi di alto profilo (presumibilmente Twitter) lo facciano altrettanto bene. - Se aggiungi un proxy tra il client e il server OAuth 2 per aggiungere
client_secret
alle richieste, non migliora la sicurezza poiché è simile a ignorare del tuttoclient_secret
. - L'unica preoccupazione per la sicurezza che ho potuto trovare relativa all'inclusione di
client_id
eclient_secret
nel client è che un utente malintenzionato può implementare il proprio client che, se fornito delle credenziali dell'utente, può agire per conto dell'utente. Questo non sembra un probabile attacco, poiché il phishing è simile e offre maggiori vantaggi.
Le seguenti domande sono ancora senza risposta per me:
- Qual è la differenza tra il flusso di credenziali del cliente e il flusso della password del proprietario della risorsa ? Quale dovrei preferire? Le risposte a questa domanda do non darmi una chiara comprensione della differenza.
- Ci sono problemi di sicurezza importanti nell'uso del flusso implicito o è fattibile?
- È possibile incorporare
client_secret
sicuro?- In caso contrario, qual è l'alternativa? Devo ancora richiedere
client_id
o consentire l'utilizzo di client "pubblici" (non registrati)
- In caso contrario, qual è l'alternativa? Devo ancora richiedere