Avendo un'applicazione web con un'API REST (ad esempio, our-app.com), vogliamo aprire la nostra API ad applicazioni web di terze parti (ad esempio, loro-app.com). Dopo alcune ricerche, dopo aver letto su OAuth, OpenID Connect, ecc., Dubito che questi siano realmente necessari per l'uso previsto. Penso che l'implementazione più semplice descritta qui di seguito potrebbe fare anche il lavoro, estendendo il nostro meccanismo di accesso esistente basato sulla sessione.
Più esattamente, vogliamo ottenere quanto segue:
- L'utente ha un account per la nostra applicazione web our-app.com e ha effettuato l'accesso.
- L'utente visita loro-app.com (nello stesso browser).
- L'utente accetta di condividere i suoi dati con loro-app.com .
- Ora, loro-app.com può effettuare richieste API AJAX di origine incrociata autenticate al nostro-app.com. Poiché il browser invia il cookie di sessione esistente, non è richiesto alcun accesso separato se l'utente ha già effettuato l'accesso sul nostro sito.
Puoi rivedere la mia implementazione suggerita e indicare i nostri difetti di sicurezza o altri svantaggi? Quali benefici otterremmo dall'utilizzare, ad es. OAuth invece?
- Their-app.com si registra per l'utilizzo della nostra API. Di conseguenza, "loro-app.com" viene aggiunto come origine CORS consentita al nostro database.
- Un utente visita loro-app.com nel suo browser.
- Le richieste LApp link per scoprire è l'utente è loggato.
- Tecnicamente, questa è una richiesta AJAX "withCredentials".
- Poiché loro-app.com è un'origine registrata, questa chiamata API cross-origin è consentita dai nostri server web. (Tutte le richieste CORS da un'origine sconosciuta another-app.com verrebbe respinta.)
- Se l'utente non ha effettuato l'accesso o se l'utente ha effettuato l'accesso ma non ha ancora concesso l'accesso a loro-app.com, la risposta includerà un URL. Questo URL punta alla nostra pagina di accesso (ad esempio, link ). LoroApp dovrebbero quindi aprire questo link in una nuova scheda, per consentire all'utente di accedere.
- La pagina di accesso chiederà nome utente / password (se non è ancora stato effettuato il login), determinando l'impostazione di un cookie di sessione, quindi chiederà qualcosa come "Vuoi permettere a loro-app.com di accedere ai tuoi dati?" Dato che tutto ciò avviene in una scheda separata, la password non può essere osservata dalla loro app.
- Se l'utente concede l'accesso, una voce ("their-app.com", userID) viene aggiunta al database, per ricordare la sua decisione.
- Tutte le richieste di cross-origine alla nostra API vengono gestite in questo modo:
- Prima cerca se l'origine è registrata. In caso contrario, rifiuta.
- Quindi cerca la sessione dell'utente se è stato fornito un cookie di sessione.
- Se un utente ha effettuato l'accesso, ma non ha ancora concesso l'accesso all'origine, rifiutiamo la richiesta, restituendo un collegamento come descritto sopra.
- Se un utente ha effettuato l'accesso e ha già concesso l'accesso a terze parti, elaboriamo la richiesta allo stesso modo delle richieste di origine originaria dalla nostra app Web.
- Se non hai effettuato l'accesso, è possibile accedere solo ai dati pubblici.