26

Desidero consentire agli utenti di accedere al mio sito Web utilizzando il loro ID Facebook senza ricaricare la pagina. Questo è il motivo per cui utilizzo Facebook Javascript SDK. Questo schema descrive il flusso di autorizzazione con questo SDK: enter image description hereCome autorizzare in modo sicuro un utente tramite l'SDK Javascript di Facebook

Al termine del processo so che l'utente è loggato e conosco il loro ID di Facebook. Posso quindi registrarli nel mio database tramite questo ID e lasciarli utilizzare per accedere in seguito.

Tuttavia, questo sembra terribilmente insicuro. Per consentire al mio script sul lato server di conoscere l'ID dell'utente, devo inviarlo tramite AJAX. Tuttavia, non ho modo di sapere se si tratta del proprietario dell'ID che sta tentando di accedere. Chiunque può inviare la richiesta POST con un ID (in particolare uno si impossessa dell'ID di un altro utente).

La mia idea attuale è quella di permettere all'utente di accedere tramite JS SDK, come al solito, inviare l'ID e token di accesso tramite la tecnologia AJAX al server e quindi utilizzare cURL nello script PHP per assicurare che l'utente sia effettivamente connesso.

È questa la strada da percorrere, o sto trascurando alternative migliori?

+1

Perché non combini semplicemente javascript-sdk con php-sdk perché sembra che tu stia utilizzando php come lingua lato server in ogni caso – TommyBs

risposta

24
  1. Non è necessario spingere l'ID dell'utente tramite la tecnologia AJAX. Dovresti, sul lato server, utilizzare il cookie fbsr_ {app_id} che contiene la richiesta firmata. Analizza questa richiesta firmata usando il tuo app_secret 'segreto' emesso da FB per ottenere 'user_id'. NOTA: un analisi riuscita mostra anche che i dati dei cookie forniti da FB non vengono manomessi.

  2. Dopo aver analizzato la richiesta firmata, è necessario anche ottenere l'ora "issued_at". Controlla che questa volta sia negli ultimi 10 minuti. In questo modo, si sa che la richiesta di accesso ha colpito il server in quanto l'utente (con user_id) ha utilizzato l'SDK lato client. (Consultare: http://developers.facebook.com/roadmap/completed-changes/)

  3. È necessario scambiare immediatamente questo codice per un token di accesso. Se questo non riesce (FB ti darà un messaggio di errore di tipo OAuthException), significa che c'è stato un ritardo innaturale tra l'accesso dell'utente a Facebook e la richiesta di accesso.

Con il passaggio 2, è possibile contrastare i tentativi di attacco utilizzando il vecchio cookie fbsr_. Se l'utente (da user_id) ha già un account con te, allora potresti voler fermarti qui e accedere all'utente. Tuttavia, potrebbero esserci degli scenari in cui la tua app_secret potrebbe essere compromessa.Per risolvere questo caso, è necessario seguire il passaggio 3, poiché lo scambio di codice per access_token può avvenire solo una volta e entro 10 minuti dal numero. Se l'utente non ha un account con il tuo sito, è comunque necessario il passaggio n. 3 per utilizzare access_token per il recupero di altri dati utente necessari, come nome, email, ecc. Da FB.

Pertanto, qualcun altro che ruba il cookie della vittima e tenta di attaccare è possibile solo entro questo intervallo di sicurezza di 10 min. Se non si è soddisfatti di questo problema di sicurezza, è necessario migrare all'autenticazione lato server. La decisione dipende dalla sensibilità delle informazioni dell'utente che memorizzi. E non compromettete nulla spostando l'autenticazione lato server, potete continuare a utilizzare i metodi lato client per altre cose contemporaneamente.

+0

@exizt Ho provato a chiarire alcuni punti per la tua comprensione. Se questo risolve la tua domanda, dovresti accettare la risposta. – Ethan

+0

Sto usando java sul mio lato server. Quali sono le API di call to graph che ho fatto per il primo passo? –

+1

Cosa intendi con l'analisi del cookie? come fare questo usando node.js o ASP.net? –

8

Dopo aver effettuato l'accesso a un utente tramite l'SDK JS, verrà configurato un cookie speciale contenente le informazioni di credenziali (codificato con la chiave segreta se sono corretto). Queste informazioni possono quindi essere utilizzate tramite lo PHP SDK getUser() method.

Fintantoché l'API (il tuo terminale ajax) si trova nello stesso dominio della tua app, dovresti ricevere questo cookie ogni volta che l'utente richiede il tuo server.

Ovviamente, è necessario assicurarsi che l'SDK di Javascript sia configurato correttamente e che sia stato utilizzato il cookie: true config option e che si fornisca un valid channel file. Se questi requisiti non vengono soddisfatti, potresti avere problemi con le comunicazioni tra domini e cookie di terze parti in IE e Safari.

È inoltre possibile controllare questa domanda correlata: A proper approach to FB auth