Sicurezza FB Oauth CSRF, sito Web PHP

6

Sto facendo esperimenti con l'accesso di terze parti, utilizzando Twitter e Facebook.

Dopo aver ottenuto il token di accesso da queste parti e confermandone la validità, emetto quindi il mio token JWT utilizzato nel mio cluster di applicazioni. L'unica cosa che uso per il token di terze parti è ottenere un indirizzo e-mail e un ID utente, non interagisco con il social network in nessun altro modo, eccetto che per la riconvalida. Fondamentalmente è proprio così che gli utenti non debbano inserire una nuova password.

Ho diversi servizi, ciascuno su sottodomini diversi. Questi servizi in qualche modo aderiscono alla filosofia dei microservizi, e ciascuno è responsabile dello stretto ambito di funzionalità (ad es. UAC, repository di entità di bus ecc.)

L'unico scopo del token JWT è di ridurre la complessità del controllo dell'autorizzazione tra gli altri servizi, che non dovrebbero essere consapevoli del provider Oauth. Inoltre, non desidero identificare il fornitore che hanno scelto nel JWT visibile pubblicamente.

Ho installato SDK di terze parti (approvato ufficialmente) sul microservice UAC, con cui sto interagendo tramite la richiesta AJAX.

EDIT: flusso aggiornato, per una migliore chiarezza

  1. Dal livello di presentazione: richiede l'URL di autorizzazione dal modulo UAC. Sul lato del modulo UAC, l'SDK gestisce il token CSRF creando, e purtroppo anche archiviando (almeno l'FB SDK lo fa). Il token CSRF è impostato sulla sessione.
  2. Reindirizza l'utente alla pagina di autenticazione FB, l'utente autorizza, viene rinviato al mio livello di presentazione con un token CSRF per confrontare
  3. Qui è dove si verifica il controllo CSRF DOVREBBE , ma il token originale non è impostato nella sessione corrente, ma è nel modulo UAC
  4. Dal livello di presentazione - lato server: acquisisci token Oauth e token CSRF, invialo al modulo UAC
  5. È qui che si verifica il controllo CSRF POTREBBE , ma la comunicazione server-server non ha la sessione. È qui che salta il controllo CSRF ingannando l'SDK per accettare qualsiasi gettone CSRF appena entrato
  6. Convalidare il token Oauth, scambiare per uno longevo, recuperare i dati degli utenti, creare entità utente nel mio database, rilasciare JWT, fatto.
  7. JWT viene impostato da Livello presentazione - lato server con SetCookie. Questo cookie usa HttpOnly e Secure (ma questo non è proprio il problema qui)

In termini più semplici : voglio ottenere la stessa funzionalità di Oauth regolare con questi provider, ma ho bisogno di dividere il processo tra due sottodomini. Nessuno di questi dovrebbe avere la sessione PHP se possibile, tranne per il breve momento dell'SDK di FB che mi costringe a usarne uno.

Ciò che ho provato fino ad ora : ho modificato l'architettura un po 'e invece di parlare direttamente al modulo UAC da javascript, rimbalzo la richiesta attraverso il lato server sul livello di presentazione, e in quello sessione I memorizza il token CSRF originale. Quando in seguito l'utente torna dalla pagina di autenticazione FB, posso eseguire il controllo. Devo ancora ingannare l'SDK sul lato UAC, ma quello è dopo che ho verificato il CSRF (anche se non attraverso l'SDK stesso) Posso andare avanti con questo approccio? È rischioso in alcun modo, perché invio il token CSRF tra i server?

    
posta Slytherin 06.02.2017 - 19:38
fonte

0 risposte

Leggi altre domande sui tag