Flusso di registrazione degli utenti nei microservizi

4

Diciamo che ho più microservizi come il servizio di autorizzazione (OAuth2 con JWT), VideoService e MyApplicationService.

Il VideoService fornisce video per MyApplicationService. Entrambi i servizi salvano i dati dell'utente.

Un frontend fa uso di tutti e 3 i servizi e un utente non sa che sta effettivamente utilizzando più servizi.

Il problema è che l'utente si registra sul servizio di autorizzazione. Pertanto, ha ancora bisogno di essere registrato presso gli altri 2 servizi. Come dovrebbe essere fatto?

La soluzione migliore che ho trovato finora è la registrazione implicita dell'utente, in modo che quando un utente sconosciuto effettua una richiesta, viene creato automaticamente un nuovo utente (purché l'autenticazione sia valida, ovviamente). Questa sembra una soluzione decente, ma non sembra "pulita".

C'è una soluzione migliore o più standard?

    
posta Maaaaa 01.09.2018 - 12:56
fonte

4 risposte

4

Qui è dove un componente di messaggistica centrale funziona bene in un ambiente di micro servizi. Il servizio di autorizzazione deve pubblicare un evento (inviare un messaggio a una coda) che un nuovo utente è stato registrato, insieme alle informazioni minime necessarie agli altri servizi. Gli altri servizi ascoltano i nuovi messaggi in questa coda e rispondono al messaggio "utente registrato" creando automaticamente il loro profilo.

Quindi in pratica il flusso di lavoro dovrebbe essere:

  1. Il servizio di autenticazione pubblica un messaggio "registrato dall'utente" nella coda di autenticazione dell'utente

  2. VideoService e MyApplicationService ascoltano nella coda di autenticazione e rispondono al messaggio "registrato dall'utente"

  3. Gli altri due servizi creano il profilo utente come risultato della risposta al messaggio "registrato dall'utente".

Per essere onesti, ogni micro servizio con la propria funzionalità "profilo utente" interrompe una delle principali linee guida dell'architettura dei micro servizi: ogni micro servizio dovrebbe specializzarsi in 1 e solo 1 funzione aziendale. Un "profilo utente" è una funzione aziendale.

Raccomando di estrarre la funzionalità "profilo utente" di VideoService e MyApplicationService in un altro servizio: il servizio profili utente.

Significherebbe identificare un'astrazione chiara per i profili utente in diversi servizi. Se non riesci a creare un'astrazione ragionevolmente per questo concetto, manterrai il profilo utente negli altri servizi.

    
risposta data 01.09.2018 - 16:01
fonte
2

In base alla tua domanda, ti suggerisco di rivedere quanto segue:

  1. "VideoService fornisce video per MyApplicationService". Idealmente, i microservizi non dovrebbero fornire (comunicare) tra loro. Dovrebbero servire solo l'utente (o il client esterno). Avere una rete di servizi che parlano tra loro crea quella che viene definita una "grande palla di fango distribuita".
  2. "Entrambi i servizi salvano i dati dell'utente". Questo va bene, a patto di salvare dati diversi. Ad esempio, "VideoService" memorizza le "categorie di video preferite dall'utente", indipendentemente dal fatto che "MyApplicationService" possa memorizzare il nome utente e il numero di telefono. Pertanto, ogni servizio memorizza solo la "parte dell'utente" necessaria per il funzionamento di tale servizio (questa è la base per evitare la comunicazione tra il servizio e il servizio).
  3. "deve ancora essere registrato presso gli altri 2 servizi". Questa è la tua domanda principale, che ti risponderò di seguito:

Se, per "registrato" si intende che ogni servizio deve "conoscere" l'esistenza dell'utente, ad esempio, quando viene registrato un nuovo utente, il VideoService crea un record con un elenco vuoto di "categorie video preferite" quindi l'approccio corretto sarebbe quello che suggeriva Greg Burghard (vorrei solo chiarire che non si mette un messaggio in coda, ma si pubblica un evento, che finisce per essere un messaggio a 2 code, uno per ogni servizio). È possibile identificare questo modello quando si soddisfano requisiti come "Quando un utente è registrato, viene creato un profilo utente predefinito" (la parte "Quando" identifica normalmente un evento aziendale pubblicato e un altro servizio è interessato).

Se, in caso contrario, quando si dice "registrato presso gli altri 2 servizi" si parla di autenticazione, il problema è completamente diverso. Personalmente non avrei un cliente che parla con più apis. Avrei invece un unico gateway API che chiamerebbe quindi le API interne dei microservizi. Questo gateway si prenderà cura dell'autenticazione e dell'autorizzazione di base (convalida dei ruoli o delle autorizzazioni richieste per accedere ad ogni endpoint). Se, d'altro canto, preferisci avere un cliente che parla direttamente con tutti i microservizi, dovresti creare un'infrastruttura condivisa che si occupi del single sign on su tutte le API, in modo che l'utente debba essere registrato una sola volta.

    
risposta data 02.09.2018 - 16:17
fonte
1

Il punto dei microservizi - o come li chiamo servizi focalizzati - si occupa di un argomento su un servizio logistico (che potrebbe essere diverse istanze fisiche).

Il tipo di architettura che descrivi potrebbe essere inserito nei seguenti servizi:

  • Auth
  • utente
  • Application
  • Video
  • (Pagamento ...)

Both services save user data.

Da quello che scrivi, non è chiaro, cosa significa "dati utente". Se ciò significa qualcosa come le informazioni correlate a un user identifier , questo andrebbe bene. Se stai memorizzando un qualche tipo di oggetto "utente", ciò potrebbe essere soggetto a modifiche. Tutto ciò che è correlato all'utente dovrebbe essere mantenuto nel User -Service.

Mentre distribuisci la tua applicazione, devi distribuire il User per dire. Ogni servizio ha una prospettiva su ciò che un utente è. Se hai bisogno di un sommario, devi aggregarne uno.

The problem is that the user registers on the authorization service. Therefore, he still needs to be registered at the 2 other services. How should this be done?

Segue una descrizione dichiaratamente semplicistica, ma dovresti ottenere il punto:

Da quello che era wirtten sopra. Il lavoro di auth -Service è semplicemente quello di creare un singolo punto di fiducia.

Il servizio auth è qualcosa come un "botteghino" che offre i biglietti per entrare.

Gli altri servizi si fidano di biglietti validi offerti dal servizio auth . La loro unica responsabilità è di controllare la validità del biglietto che il visitatore ha.

Non è necessario che i singoli servizi sappiano, se esiste un utente specifico. Devono solo fidarsi del ticket . O per metterlo in un altro modo: l'utente non deve essere registrato in nessun altro servizio rispetto al servizio auth .

La domanda più interessante sarebbe, come distribuire le informazioni che un ticket valido fondamentalmente dovrebbe essere invalidato. Ma questo è un altro argomento.

Mi raccomando per ulteriori letture:

Autorizza come servizio:

On Premise

risposta data 01.09.2018 - 18:54
fonte
0

TL DR; fai il lavoro di sicurezza sul gateway API e instradare la richiesta su microservice se tutto è OK.

Dovresti utilizzare l'approccio gateway API per la tua architettura microservice.

Supponiamo di avere un gateway API (zuul, ecc.) È possibile connettere il server di autenticazione (UAA, keycloak, ecc.) direttamente a quel gateway. E definire un filtro preliminare che verifica la richiesta di autorizzazione della richiesta in entrata. In caso affermativo, verificare il token a livello di gateway (chiedendo direttamente al server di autenticazione che il token sia valido e abbia un'autorizzazione valida per eseguire il particolare lavoro) e instradare la richiesta al microservice che si desidera consumare.

    
risposta data 03.09.2018 - 12:47
fonte

Leggi altre domande sui tag