API REST Oauth 2 - Quale tipo di concessione utilizzare?

4

Ho un'applicazione che in pratica inserisce alcune righe dall'attuale applicazione web front-end.

Tutte le chiamate prima che il livello di servizio verifichi / convalidi se l'utente è autorizzato a inserire dati o meno (questo è il punto in cui sono bloccato con il mio approccio attuale descritto di seguito).

Devo creare un'API REST che permetta ad altri utenti / sviluppatori di terze parti (diciamo Developer A) di inserire alcuni dati automaticamente tramite alcune chiamate HTTP.

Ci sono due scenari per lo scenario sopra.

  1. Inserisci dati per conto dell'utente - Utenti sullo sviluppatore Un sistema fa qualcosa. Lo sviluppatore A esegue quindi un endpoint REST HTTP per inserire alcuni dati nel nostro sistema.

  2. Inserisci dati per conto del sistema - Lo sviluppatore A vuole inserire alcuni dati direttamente nel nostro sistema senza alcuna interazione da parte dell'utente (come un caricamento in batch di dati in cui non ci sarà interazione dell'utente sul sito dello sviluppatore A).

Ora ho creato un'API REST che utilizza Oauth 2.0 e sto permettendo i tipi di sovvenzione Authorisation Code e Client Credentials .

Authorisation Code risolve il mio primo scenario, in cui lo sviluppatore A reindirizza l'utente al mio sito per l'autenticazione e l'autorizzazione, così quando creo il token di accesso, mantengo il collegamento tra l'utente e il token di accesso (che uso in seguito per stabilire quale l'utente ha creato il token e quindi verifica se l'utente è autorizzato a inserire o meno dati).

Ora per il secondo scenario, sto usando Client Credentials dove lo sviluppatore A può immediatamente ottenere il token di accesso senza l'interazione dell'utente.

Quindi, in questo scenario, quando il mio codice tenta di convalidare la chiamata da questa chiamata REST, fondamentalmente fallisce perché il token di accesso non viene creato per un particolare utente .

Come dovrei risolvere questo problema? Sto andando in una direzione sbagliata?

Devo ridefinire la logica di convalida, (per ignorare la convalida in quanto il token di accesso da parte delle credenziali del client può essere ottenuto solo da un client fidato)? Oppure creare un utente fittizio / anonimo da associare al token di accesso per le credenziali del cliente?

UPDATE:

Solo qualche altro chiarimento e il mio ulteriore approccio.

La convalida menzionata sopra non è la convalida di nome utente / password, è una logica aziendale personalizzata che dipende dall'ID utente interno per verificare l'autorizzazione per un utente.

Ricevo questo ID utente come quello che ha autorizzato l'utilizzo del tipo di concessione del codice di autorizzazione.

Ma per le credenziali del cliente, il mio soggetto non è un utente, è un'applicazione, che non è la stessa dell'id utente.

Sto pensando di associarmi per affrontare questo come di seguito:

Un utente amministratore diciamo che User1 registrerà l'applicazione (creando ID client / segreto) nel mio sistema per utilizzare l'API. Prenderò nota dell'ID di questo utente nel mio sistema insieme ad altri dettagli relativi a Oauth (ID client / nome segreto / app, ecc.). Pertanto, quando lo sviluppatore utilizza le credenziali del client, che identifica l'applicazione (non un utente specifico), interrogherò il database e otterrò l'id utente del User1 che ha registrato l'applicazione. Quindi userò questo id utente per continuare tutte le convalide della logica aziendale (e passerebbe questa volta, perché questo utente User1 avrà accesso a tutte le risorse nel sistema, poiché è un utente amministratore).

Fammi i tuoi pensieri / commenti con questo mio approccio.

    
posta Abubakkar 18.03.2017 - 20:42
fonte

2 risposte

1

La logica aziendale presuppone che un utente finale sia l'unico tipo di identità che può eseguire azioni (ad esempio, inserimento di record). Si scopre che l'assunto è falso e che si dispone di un secondo tipo di identità: un'applicazione client. Posso vedere un paio di opzioni:

Crea un falso / pseudo utente per rappresentare l'applicazione client, ovvero un account di servizio. Fornisci all'utente le impostazioni necessarie per far sì che il sistema si comporti come previsto, ma assicurati che non sia possibile per gli utenti reali effettuare il login come questo pseudo utente e magari nascondere l'utente dalle schermate di gestione. È quindi possibile inserire i dettagli di questo utente nel proprio token di accesso oppure fare in modo che l'API cerchi i dettagli di questo utente quando riceve un token di accesso.

Ciò che probabilmente vorrai è che la tua logica aziendale riconosca sia gli utenti che le applicazioni client come tipi di identità validi: se strizziamo un po 'e rinominiamo la tabella degli utenti in "identità", è una specie di cosa abbiamo fatto creando falsi / pseudo utenti. A seconda della struttura del codice / database, tuttavia, potrebbe risultare più semplice aggiornare il codice e lasciare la tabella degli utenti così com'è.

    
risposta data 22.12.2017 - 19:55
fonte
1

Se comprendo il tuo flusso, puoi lavorare solo con la concessione del "codice di autorizzazione" e aggiungere l'API REST che sarebbe consentita solo per l'utente amministratore (questa è nascosta nei dati di configurazione, non esposta ad altri utenti). Quindi, in pratica, l'amministratore è l'unico che può utilizzare questa nuova API REST, che ignorerà il "meccanismo di convalida" che descrivi.

    
risposta data 21.02.2018 - 09:22
fonte

Leggi altre domande sui tag