Sto cercando di migliorare la sicurezza di un'API REST esistente a cui si accede tramite SSL. Il servizio web è multi-tenant, in modo tale che ogni inquilino abbia un TenantId assegnato.
Il problema che sto affrontando può essere riassunto come:
- Come posso determinare l'inquilino?
- Come posso determinare se il cliente è legittimo?
- La sicurezza basata su cookie HTTP è adatta all'attività o dovrei prendere in considerazione il token?
Attualmente
Attualmente emettiamo manualmente (cioè fuori processo - al telefono, ecc.) una chiave API per ogni client, che includono come intestazione HTTP in ogni richiesta. Questa chiave API si associa a un TenantId. Quando il client invia una richiesta di accesso all'API REST, determiniamo il TenantId, che a sua volta ci consente di verificare il nome utente / password nel database dei titolari corretto. Una volta successo, emettiamo un cookie HTTP limitato nel tempo. Tale cookie viene quindi utilizzato nelle richieste REST successive. Internamente, quel cookie è collegato a una sessione e la sessione contiene informazioni sul profilo utente per ridurre il carico db.
Siamo consapevoli che questo ha alcuni rischi intrinseci per la sicurezza. La chiave API potrebbe essere facilmente estratta dal codice sorgente del client smontato. Intendiamo anche costruire il nostro cliente come una SPA in JavaScript che sia leggibile da chiunque. Sebbene possiamo revocare / cambiare le chiavi, sto cercando un'implementazione standardizzata più sicura.
Alternativa
A quanto ho capito, potrei utilizzare un'alternativa basata su token ai cookie. HMAC è un meccanismo di autenticazione comune per le applicazioni Web, ma ciò richiede la memorizzazione di un segreto condiviso nel client e nel server. Questo segreto sembra avere lo stesso problema della chiave API sopra; in quanto può essere trapelato.
Ho letto anche un po 'di JWT, che sembrano estendere il concetto HMAC in che il server possa persistere i dati di "sessione" dell'utente nel token, riducendo il numero di chiamate al database per le informazioni utente / profilo. Il token JWT viene utilizzato come risultato di un accesso utente / password riuscito. Quindi non c'è nessun problema segreto condiviso qui corretto?
Ho anche letto un po 'di OAuth2, in particolare la concessione di credenziali per password del proprietario di risorse . Non sono nemmeno sicuro se OAuth2 risolva il mio problema.
Determinazione dell'inquilino
Il primo passo è determinare l'inquilino. Piuttosto che usare la chiave API per mappare su TenantId, potrei:
- Richiedi il TenantId come parte della richiesta di accesso
- Utilizza una mappatura del sottodominio per mappare su TenantId
Convalida del chiamante dell'applicazione
In secondo luogo, devo determinare se una determinata applicazione client è autorizzata ad accedere all'API REST. Da parte mia, sto bene e veramente senza idee brillanti. È quello in cui OAuth2 viene in soccorso?
L'unico modo in cui posso pensare di risolvere questo problema è di rilasciare l'applicazione chiamante con una chiave API temporanea in scadenza dopo che l'utente ha effettuato l'accesso. Anche se non garantisce che l'applicazione non sia canaglia, riduce il rischio a un utente malintenzionato che ha anche ottenuto l'accesso alle credenziali di un utente.
La mia attuale soluzione per cookie HTTP è accettabile? Devo invece passare a un meccanismo di autenticazione basato su token?
Accolgo con favore qualsiasi consiglio tu possa avere. Sto guadando masse di informazioni e sto cercando di capire tutto questo. Qualsiasi consiglio sarebbe felicemente ricevuto!