Stiamo cercando di determinare il modo migliore per autorizzare gli utenti in un'architettura di microservizi, garantendo al contempo che i microservizi abbiano autorizzazioni limitate. La nostra architettura utilizza un servizio di autorizzazione centrale per gestire l'emissione di token JWT.
Abbiamo i seguenti requisiti:
Gli utenti dovrebbero essere limitati a svolgere determinati ruoli. ad esempio, un utente dovrebbe essere in grado di creare / modificare / leggere solo i contenuti di sua proprietà.
I microservizi dovrebbero essere limitati alle sole autorizzazioni necessarie. ad esempio un microservizio che deve solo leggere i dati da un altro servizio dovrebbe essere esplicitamente vietato dalla scrittura di dati a quel servizio.
Ad esempio, supponiamo di avere un sistema in cui gli utenti possono caricare immagini su un servizio di archivio di immagini. Abbiamo un servizio di tagging che tagga automaticamente le foto con una posizione. Gli utenti possono solo CRUD le proprie immagini. Il servizio di tagging può leggere qualsiasi immagine dal servizio di archivio di immagini, tuttavia non dovrebbe essere in grado di modificare / eliminare.
Qual è un buon modo per ottenere quanto sopra usando i token JWT? Alcune soluzioni che abbiamo discusso sono:
Il servizio di archivio immagini espone 2 API, una disponibile esternamente (che consente l'accesso CRUD utente) e una disponibile internamente (che consente l'accesso interno di sola lettura). Sembra inflessibile: cosa succede se un altro servizio interno ha bisogno dell'accesso in lettura / scrittura a tutte le immagini (ad esempio uno che elimina automaticamente le immagini esplicite)?
Abbiamo impostato due autorizzazioni nel JWT dell'utente, uno è CRUD_OwnImages, l'altro è READ_ForAnalysis. Il servizio di tagging può vedere se l'utente dispone delle autorizzazioni READ_ForAnalysis e, in tal caso, effettuare la richiesta appropriata. Abbiamo un altro microservizio che verifica se l'utente ha CRUD_OwnImages per le operazioni CRUD sulle proprie immagini. Ciò pone la responsabilità su ciascun microservizio per garantire che l'utente sia limitato alle azioni richieste. Il negozio di immagini non ha modo di limitare ogni microservizio con questo approccio, quindi è potenzialmente esente da errori e soggetto a errori.
Diamo al microservizio di tagging il proprio utente, con READ_ForAnalysis come autorizzazione. Quindi, quando il servizio di tagging richiede immagini dall'archivio immagini, gli viene dato accesso, ma è vietato modificarle. L'utente dell'utente ha solo l'autorizzazione CRUD_OwnImages, quindi è in grado di recuperare e accedere solo alle sue immagini dal frontend. Se un altro servizio necessita di CRUD per tutti i dati, possiamo fornirgli CRUD_AllData o simili. Ci piace questo approccio poiché ogni servizio è ora responsabile dei propri dati (piuttosto che la logica viene duplicata su più servizi), ma cosa succede se il servizio richiede sia autorizzazioni utente che autorizzazioni microservizio? Possiamo inviare due token JWT (sia l'utente che il microservizio) in modo sicuro? C'è un modo per combinare le autorizzazioni in modo sicuro e inviarlo attraverso? per esempio
Il problema si aggrava se le informazioni dell'utente sono necessarie più a valle (2 o 3 microservizi di distanza). Supponiamo solo che spetti ai singoli microservizi limitarsi alle azioni di cui hanno bisogno e non renderlo esplicito?