Protezione di un'API multi-tenant con SSO e diversi ruoli per tenant

3

Sto lavorando allo sviluppo di un'API REST che verrà utilizzata dai clienti di prima parte che sviluppiamo e dai clienti di terze parti in futuro. I client di prima parte includono un'applicazione lato client SPA e programmi eseguiti su PC client (non possono garantire la sicurezza dei segreti).

Inoltre, questa API è pseudo-multi-tenant. Disponiamo di più titolari e ciascun titolare può avere una o più istanze attive nell'API, ciascuna con il proprio set di ruoli di sicurezza, ognuno con autorizzazioni diverse. Tutti questi dati tuttavia sono archiviati nello stesso database e vogliamo consentire agli utenti di cambiare l'istanza su cui stanno lavorando (sia in-tenant che out-of-tenant). Accedi È possibile utilizzare servizi di terze parti (Facebook / Google / ecc.). Inoltre, il loro accesso dovrebbe consentire loro di accedere alle altre istanze senza eseguire nuovamente l'autenticazione.

Mi sto un po 'confondendo su come dovrei implementare la logica di autenticazione / autorizzazione data la natura multi-tenant / multi-ruoli dell'API. Quello che sto pensando è il percorso giusto per implementare l'autenticazione OpenID Connect per l'API e quindi OAuth per delegare l'accesso alle istanze specifiche che l'utente sta tentando di eseguire. La mia confusione entra in gioco quando cerco di determinare quali token dovrebbero essere in uso dove. Vogliamo che i nostri utenti abbiano la possibilità di rimanere connessi alla SPA e comunque modificare la loro istanza.

Ho visto informazioni sulla protezione di API REST multitenant / multidatabase, ma i ruoli sembrano essere coerenti, quindi non posso estrapolare la gestione a un database con vari ruoli.

Quindi queste sono le mie domande:

  • È corretto utilizzare OpenID Connect e OAuth2 in base a queste informazioni?
  • Sembra che OpenID Connect consenta di pubblicizzare gli ambiti che desideri delegare. Come sarebbe gestito questo con ruoli indeterminati fino a dopo l'autenticazione e quando il loro inquilino è noto?
  • È corretto delegare le singole autorizzazioni tramite OAuth (cosa voglio fare) oppure OAuth dovrebbe delegare i ruoli assegnati per istanza e l'applicazione deve quindi cercare le autorizzazioni?
  • Dovrebbero esserci due token separati, uno per l'autenticazione generale e uno per l'autorizzazione per istanza? Quale sarebbe lo standard per passare questi all'API. Attualmente stiamo usando JWT e un'intestazione di Authorization Bearer. Mi piace la semplicità di un token, ma se questo deve essere modificato, modificato, possiamo farlo.

Ho cercato articoli per la settimana scorsa o due su questo argomento, ma non ho trovato nulla che possa aiutare a chiarire quale tipo di flusso sarebbe il migliore per la mia situazione e come gestisco la variabilità da istanza ad istanza. Se pensi di aver perso un articolo, per favore sentiti libero di aggiungerlo a questo come commento e lo esaminerò anch'io.

    
posta tostringtheory 28.08.2017 - 17:31
fonte

1 risposta

2

Non sono un programmatore, ma ho esaminato un'org che sembra fare qualcosa di simile. Ecco come lo fanno ...

Il client AngularJS esegue l'autenticazione con un'API di sicurezza dell'applicazione che abbiamo tramite OAuth. Il sistema che ospita l'API passa quindi l'autenticazione e richiede l'autorizzazione da un secondo sistema. Il secondo sistema restituisce il token authZ, il nome utente e le richieste al sistema di sicurezza API. L'API di sicurezza chiama un sistema di gestione token che crea un JWT e lo restituisce al sistema API di sicurezza. Infine, l'API di sicurezza restituisce il JWT codificato al client AngularJS.

Una singola chiamata passa dal client AngularJS all'API dell'applicazione vera e propria, fornendo il token. Il sistema API dell'applicazione fornisce il token al token manager per la convalida. Se è valido, l'API restituisce i dati (o genera gettoni non validi o scaduti).

Per il rinnovo, il client AngularJS contatta nuovamente l'API di sicurezza, che contatta il sistema token authZ, restituendo il token rinnovato al sistema API di sicurezza, che lo invia al token manager per la creazione di un nuovo JWT, che l'API di sicurezza ritorna al cliente.

Al cambio di titolare, esegue una chiamata di richiesta di trasferimento token authZ all'API di sicurezza che arriva fino al server token authZ, un nuovo token authZ viene creato e inviato all'API di sicurezza insieme a nome utente e ruoli, richiede una JWT e, una volta restituito, lo passa al client.

Per rispondere più direttamente alle tue domande ...

  • Sembra corretto utilizzare OAuth e OIDC
  • Non so sull'ambito della pubblicità.
  • Sono in sicurezza, quindi sono un fan del controllo degli accessi basato sui ruoli per tutto. MrGreen Quindi direi che l'applicazione esegue le singole ricerche perm ai ruoli incorporati nel token.
  • Due token separati sembrano essere come questa organizzazione si occupa di esso. Uno, che sembra funzionare sia come identità che come ID di sessione. Il secondo è il JWT che include quel primo token e i ruoli / attestazioni per il tenant corrente.
risposta data 06.09.2017 - 20:08
fonte

Leggi altre domande sui tag