Come mettere in sicurezza diverse richieste API per un singolo utente

4

Sto scrivendo un'applicazione web con Python e Flask. Ad un livello elevato, il servizio Web accetta un ID, scarica un file da un'API di terze parti sulla base di tale ID, legge e analizza i dati all'interno del file e infine restituisce tale analisi al client.

Poiché questo processo richiede un bel po 'di tempo, mi piacerebbe avere notifiche al client quando (1) il file viene scaricato, (2) il file viene analizzato, e (3) il valore analizzato ha stato restituito Poiché HTTP è basato su un'unica architettura del ciclo richiesta-risposta, ho deciso di suddividere ogni passaggio in un endpoint API. Il lato client JavaScript gestirà il concatenamento delle richieste AJAX e l'aggiornamento del client dello stato di avanzamento.

Ecco il flusso di lavoro di richiesta-risposta che ho in mente:

  • 1 bis. Il front-end effettua una richiesta con un ID a un endpoint "download" e notifica al client che il file è in fase di download.
  • 1 ter. Il server scarica il file e risponde al front-end con il nome file scaricato. Quando ha successo ...
  • 2 bis. Il front-end effettua una richiesta con il nome file dal passaggio 1 e alcuni valori di configurazione aggiuntivi, impostati quando l'utente fa inizialmente clic su "invia" - a un endpoint "Analizza" e quindi notifica al client che il file è in fase di analisi. / li>
  • 2b. Il server analizza il file in base alla configurazione del client e genera un file di output con l'analisi. Il server risponde quindi con il nome file di output.
  • 3 bis. Il front-end inoltra quindi una richiesta all'endpoint "output" con il nome file di output del passaggio 2 e notifica al client che il file di output viene scaricato localmente.
  • 3b. Il server restituisce semplicemente il file statico su richiesta. Il server elimina quindi il file di output.

In generale, la mia domanda è: questa architettura funziona? Più in particolare:

  • C'è un modo migliore per mostrare progressi al cliente? Questo sembra un sovraccarico per quella funzionalità - d'altra parte, è bello avere endpoint API più puliti.
  • Cosa succede quando il client A e il client B richiedono gli stessi dati back-to-back? La procedura lato server del client B potrebbe rispondere che il file di output è pronto subito prima che il processo del client A cancelli il file. C'è un modo per evitare questo scenario?

Mi rendo conto che è un po 'complicato, ma sono abbastanza nuovo per lo sviluppo back-end e sono molto aperto a qualsiasi suggerimento.

Grazie in anticipo.

    
posta gwg 10.11.2014 - 23:07
fonte

2 risposte

4

Ci sono diverse parti della tua domanda che cercherò di risponderle.

Architettura

Per quanto riguarda l'architettura, suggerirei un semplice endpoint che restituisca lo stato corrente di un processo o di un socket Web (se supportate solo i browser moderni). Utilizzando un endpoint di stato, il client può semplicemente eseguire il polling o ascoltare il socket per gli aggiornamenti di stato. Quando lo stato cambia in qualcosa il client viene aggiornato e risponde di conseguenza.

In questo modo avrai solo endpoint per ogni attività e un endpoint di stato. Il server può quindi eseguire qualsiasi attività in qualsiasi ordine o rispondere con un errore se viene effettuata una richiesta nell'ordine sbagliato.

Monitoraggio client

Due cose potrebbero aiutarti a risolvere il client A vs il client B.

Mi sembra che tu debba tenere traccia delle variabili di sessione. Mantieni le richieste dei client separate da una casella l'una dall'altra salendo i nomi dei file con un ID o una sessione specifici del client. Questo aiuterà anche a mantenere il tuo sito sicuro. Non si desidera consentire il caricamento e la condivisione di contenuti arbitrari dell'utente con altri client, a meno che non sia possibile sanitizzarlo. Ad esempio se il Cliente A fosse malevolo e caricato javascript e il Cliente B dovessero scaricarlo nel suo browser, javascript verrà eseguito nel contesto del tuo dominio e potrebbe finire per fare cose cattive.

Inoltre, potrebbe essere utile non cancellare il file subito, ma per fare in modo che uno script separato ripulisca a intervalli di tempo prestabiliti. Vedi Cron o Pianificazione delle attività .

Ho usato gli script di cron che controllano un determinato percorso di file per i file più vecchi di un dato periodo di tempo. In questo modo elimino bene i file dopo che sono stati necessari.

    
risposta data 08.02.2015 - 08:52
fonte
-2

L'alternativa potrebbe essere quella di utilizzare un frameowrk batch come il batch di primavera. Il vantaggio rispetto a javascript sarebbe facile da configurare, la registrazione intrinseca, i tentativi e il monitoraggio e una facile integrazione con altri sistemi che aiuteranno nell'invio di notifiche e download di file

    
risposta data 14.11.2014 - 06:32
fonte

Leggi altre domande sui tag