Sono in procinto di progettare 3 componenti che funzioneranno in symphony l'uno con l'altro:
- Un servizio web RESTful che richiede
BasicAuth
su HTTPS su tutte le chiamate e che è ciò che effettivamente fa tutto il lavoro pesante per il mio sistema (funziona) - Un'interfaccia utente web che traduce le azioni dell'utente finale in chiamate API al suddetto servizio Web; quindi l'interfaccia utente è "supportata da" il WS
- Uno strumento CLI (command-line interface) che gli sviluppatori possono installare ed eseguire localmente, che traduce anche i comandi nelle chiamate API al WS (da qui anche "backed by" il WS)
Uno dei primi ostacoli che sto tentando di superare riguarda l'autenticazione e l'autorizzazione.
Supponiamo che WS utilizzi un servizio di directory LDAP / (come AD o forse Apache DS) come dominio di autenticazione. Significa che quando una chiamata API arriva sul filo (ad esempio, un HTTPS GET
per qualche risorsa), le credenziali BasicAuth
vengono estratte dalla richiesta e inoltrate al servizio LDAP per determinare se si tratta di un utente valido o non. Se sono autenticati, diciamo che viene utilizzato un dominio di autorizzazione separato, forse un database, per determinare se l'utente identificato può fare ciò che sta tentando nella richiesta HTTPS. Fin qui, tutto bene.
Nel caso dello strumento CLI, l'utente dovrà autenticarsi prima di eseguire qualsiasi comando, e quindi questo modello funziona perfettamente, poiché un singolo utente potrà sempre utilizzare la stessa istanza CLI in un dato momento.
Il problema si presenta quando proviamo ad integrare l'app web (UI) con il WS, perché molte persone potrebbero essere collegate all'app allo stesso tempo, tutte con autorizzazioni diverse che stabiliscono quali chiamate API di base sono autorizzate a fare .
Per quanto vedo io, sembra come se avessi solo 4 opzioni qui:
- Credenziali memorizzate nella cache : dopo aver effettuato l'accesso all'app, le credenziali sono in qualche modo da qualche parte memorizzate nella cache (in modo che l'app possa accedervi) e l'app non impone alcun tipo della stessa politica di autorizzazione. Quando gli utenti tentano di fare cose che generano chiamate API sotto il cofano, le loro credenziali vengono ricercate dalla cache e inoltrate con le chiamate API. Se il WS determina che non sono autorizzati, restituisce un errore.
-
Account a livello di servizio : l'app e il WS utilizzano entrambi gli stessi reami di autenticazione / autorizzazione, ma l'interfaccia utente web ora impone l'autorizzazione su ciò che gli utenti possono effettivamente vedere e fare all'interno dell'app. Se gli è consentito fare qualcosa che genera una chiamata API sottostante, l'app invia le credenziali dell'account di servizio (ad esempio
myapp-admin-user
) con ciascuna chiamata API per conto dell'utente. - OAuthv2 : non ho idea di cosa sia OAuth o se sia applicabile per questo scenario, ma ritengo che potrebbe essere una soluzione qui in qualche modo.
- Server token : utilizza un server token come CAS o forse Kerberos per garantire gli utenti, in modo analogo a come si comporta l'opzione Account a livello di servizio. Qui, quando un utente accede correttamente all'app, il server dei token invia l'app a un UUID di sessione e registra anche quell'UUID con il WS. Ogni volta che l'app genera una chiamata API, applica l'UUID alla richiesta, che viene quindi convalidata sul lato WS.
L'opzione " Credenziali memorizzate nella cache " solo si sente come un'aberrazione di tutto ciò che è buono e sano in sicurezza-terra. È semplicemente sbagliato memorizzare le credenziali ovunque.
L'opzione " Token Server " sembra valida per un'impostazione di tipo SSO, ma non in questo caso particolare e si sente imbarazzante per me. Penso anche che non ci sia un buon modo per usare il concetto di UUID di sessione e BasicAuth
/ HTTPS allo stesso tempo.
Quindi questo lascia OAuthv2, di cui non so nulla, e " Account a livello di servizio (SLA) * " come le uniche opzioni rimanenti. L'opzione SLA sembra OK, ma presenta alcuni inconvenienti seguenti:
- Richiede che l'account di servizio abbia fondamentalmente "privilegi di god" sul WS. In altre parole, una volta che l'app ritiene che un utente possa fare clic su un pulsante o fare qualcosa nell'interfaccia utente, ciò si traduce in una chiamata API incondizionata dall'account del servizio utilizzato dall'interfaccia utente. Mi fa male, mkay?
- Mi viene in mente che il mantenimento di due serie di permessi (il set di autorizzazioni per ogni utente dell'app e il set di autorizzazioni per l'account di servizio utilizzato dall'app contro il WS) può comportare il superamento della sincronizzazione delle autorizzazioni l'uno con l'altro in qualche modo
Quindi sembra che io non abbia davvero delle buone opzioni qui. Sicuramente non posso essere il primo dev per imbattermi in questo, ma chiedere a Google Gods non mi ha aiutato molto qui. Qualche idea?