Attualmente stiamo implementando un'applicazione a singola pagina (Angular2) e quindi abbiamo incontrato lo standard "come possiamo proteggere il nostro problema dell'API backend".
La soluzione standard a questo sembra utilizzare il flusso di Grant implicito OAuth2, che è tutto a posto. Stiamo implementando un server di autorizzazione personalizzato che si autentica utilizzando la nostra soluzione SSO Web (Apri AM / SAML), controlla le licenze e rilascia i token di accesso tramite il gateway API (Mashape Kong).
Il token di accesso è (come specificato nel flusso implicito di OAuth2) restituito allo SPA utilizzando un reindirizzamento, fornendo il token di accesso nel frammento ( https://my.spa.com/#access_token=asdfasdf&token_type=bearer&expires_in=1800
).
Finora, niente specialità. Ora: il token di accesso è valido solo per un breve periodo di tempo e non vi è alcun token di aggiornamento; non vogliamo che l'utente finale venga effettivamente reindirizzato nuovamente al server di autorizzazione (apparirebbe sfavorevole / sfarfallio / ...). La nostra idea era di utilizzare la sessione esistente con il server di autorizzazione (che abbiamo implementato, vedi sopra) per aggiornare il token di accesso (creane uno nuovo) tramite una chiamata CORS a un punto finale speciale del server di autorizzazione (chiamiamolo /heartbeat
).
Ovviamente, questo richiede un paio di cose da fare:
- Il
Origin
deve essere esattamente l'host dell'applicazione chiamante e il server di autenticazione deve verificare e riflettere quello nella risposta di preflight - L'applicazione client deve eseguire la chiamata CORS con
withCredentials: true
attivata (utilizzandoXMLHttpRequest
,credentials: include
per Fetch)
Abbiamo eseguito un'implementazione di questo test, e sembra funzionare abbastanza bene, ma voglio comunque chiedere a voi come esperti su questo: Ci sono (addizionali) vettori di attacco quando abilitate questo tipo di aggiornamento? Oltre ai soliti sospetti per la concessione implicita, cioè.
Cordiali saluti, Martin