Ho una Angular 1 SPA con un'API Restful a cui vorrei limitare l'accesso. Come capisco, in genere il flusso implicito di OIDC è progettato proprio per questo. Tuttavia, considero anche il codice SPA di frontend sensibile e vorrei limitare l'accesso a questo. Un'implementazione vaniglia del flusso implicito presuppone che il client frontend sia pubblico e quindi non lo farà.
L'unico modo pratico in cui posso pensare di proteggere gli asset dell'app è tramite un cookie. Il modo in cui ci penso ci sono alcune possibili soluzioni:
-
Utilizza il flusso del codice di autorizzazione:
- Accesso diretto alla schermata di accesso. L'utente effettua l'accesso.
- La schermata di accesso richiama l'endpoint Restful API che gestisce il codice di autorizzazione.
- Endpoint ottiene il token di aggiornamento / accesso e genera il proprio token di sessione.
- Endpoint reindirizza il browser alla SPA, inviandogli il token di sessione nella porzione hash dell'URL. Nella stessa risposta imposta un solo HTTP, cookie sicuro contenente anche il token di sessione.
- Serve la SPA solo se la richiesta contiene un cookie con un token di sessione valido.
- Una volta nella SPA, analizzare il token di sessione dall'hash e utilizzarlo nell'intestazione Autorizzazione per le richieste dell'API Restful.
- Pro : mi sembra un modo valido per utilizzare il flusso di codice di autenticazione
- Contro : sembra troppo complicato. Devo anche gestire lo stato della sessione lato server come le tradizionali app Web.
-
Utilizza il flusso implicito con una pagina di destinazione:
- Accesso diretto alla schermata di accesso. L'utente effettua l'accesso.
- La schermata di accesso richiama una pagina di destinazione (una SPA), che analizza il token di accesso dall'hash e lo memorizza in localStorage. La pagina di destinazione ha lo stesso dominio della SPA protetta.
- La pagina di destinazione utilizza il token di accesso per effettuare una richiesta API restful. L'endpoint dell'API genera e imposta un cookie sicuro solo HTTP.
- La pagina di destinazione riceve il cookie e reindirizza alla SPA protetta.
- Fornisci la SPA solo se la richiesta contiene un cookie valido.
- Una volta nella SPA, utilizzare il token di accesso da localStorage per effettuare richieste API restful.
- Pro : non è richiesto lo stato del server
- Contro : sembra ancora un po 'complicato: ora ho bisogno di due SPA.
-
Utilizza il flusso implicito con gli asset delle app pigri:
- Accesso diretto alla schermata di accesso. L'utente effettua l'accesso.
- La schermata di accesso richiama la SPA protetta. La parte non sensibile della SPA è accessibile pubblicamente.
- La SPA analizza il token di accesso e fa una richiesta API restful. L'endpoint genera e imposta un cookie sicuro solo HTTP.
- La SPA recupera il cookie e carica pigro il resto dell'app.
- Il resto degli asset dell'app viene caricato solo se le richieste contengono un cookie valido.
- Pro : sembra più un tipico utilizzo del flusso implicito, quindi è più facile ragionare sulla sua sicurezza.
- Contro : la stessa SPA è più complicata a causa del carico pigro (ma forse meno complicato delle altre due soluzioni)
Queste soluzioni sono ragionevoli? Ci sono ancora soluzioni più semplici?