Come progettare l'autorizzazione tra i microservizi docker?

1

Ho 2 micro-servizi. Uno è un Django API, l'altro è un lavoratore. Ognuno di questi vive in un contenitore docker.

L'API è un'API pubblica per il front-end Web. Gestisce le operazioni CRUD per gli utenti dell'applicazione Web e dispone solo di un back-end di autenticazione per gli utenti finali. Alcune azioni REST dell'utente creano messaggi SQS. L'API e l'operatore hanno ciascuno i propri ruoli e autorizzazioni AWS IAM. L'operatore esegue il polling dello SQS per i messaggi e, per ogni messaggio, esegue l'elaborazione.

Il problema è che dopo che l'operatore ha terminato l'elaborazione, è necessario che torni all'API con esito positivo o negativo. I lavoratori sono asincroni e potrebbero essere necessari alcuni minuti per terminare. Vedo 2 modi per farlo:

  1. Crea un endpoint sull'API per il lavoratore da colpire. Il problema con questo è che penso che l'API django dovrebbe solo autorizzare gli utenti finali dell'applicazione. Dovrei aggiungere un altro back-end di autorizzazione solo per l'endpoint dell'API o eseguire un'autenticazione basata su token.

  2. Colpisci direttamente il database, ma questo implica avere le credenziali del database in più punti.

C'è un modo migliore per farlo? Non mi piace l'idea di avere più backend di autenticazione in ciò che dovrebbe essere solo l'API CRUD dell'utente finale. Inoltre, non posso avere un utente in esecuzione nello stesso contenitore docker dell'API perché deve essere eseguito come un singolo processo all'interno del contenitore.

    
posta user1152226 08.08.2016 - 18:07
fonte

2 risposte

1

Se ho capito bene, l'API pubblica sta creando le richieste SQS che vengono servite dal lavoratore. Perché non utilizzare un approccio richiesta-risposta poiché hai già connessioni al sistema di messaggistica?

    
risposta data 08.08.2016 - 22:07
fonte
0

La tua autorizzazione è per utenti esterni. Poiché il lavoratore è interno e affidabile, perché dovrebbe essere necessaria l'autorizzazione? Suppongo che tu stia inviando un lavoro asincrono dal front-end e desideri avvisare l'utente quando è completato.

Nel mondo dell'integrazione useremmo il modello di richiesta-risposta con un identificatore di correlazione per abbinare il risultato di un lavoro al richiedente originale.

Se questo è troppo basso per te, controlla Celery che gestisce l'invio delle operazioni ai lavoratori asincroni per te. Credo che abbia anche un plug-in da utilizzare con Amazon SQS (anche se consiglio di creare un back-end RabbitMQ in un contenitore docker).

    
risposta data 08.08.2016 - 19:06
fonte

Leggi altre domande sui tag