2011-08-20 10 views
13

Qui sto usando Facebook Login pulsante plug e JavaScript SDKOttieni informazioni di base sull'utente tramite il plugin per il pulsante di accesso di Facebook?

Sono in grado di fare il login e il logout con successo utilizzando sopra.

Quando un utente per la prima volta ha eseguito il processo di autenticazione, è necessario memorizzare le informazioni di base dell'utente, ad esempio nome di accesso di Facebook, e-mail nel mio database.

Si prega di suggerire come posso farlo.

<p><fb:login-button autologoutlink="true"></fb:login-button></p> 


    <div id="fb-root"></div> 
    <script> 
     window.fbAsyncInit = function() { 
      FB.init({ appId: '123456', status: true, cookie: true, 
       xfbml: true 
      }); 
     }; 


     (function() { 
      var e = document.createElement('script'); 
      e.type = 'text/javascript'; 
      e.src = document.location.protocol + 
      '//connect.facebook.net/en_US/all.js'; 
      e.async = true; 
      document.getElementById('fb-root').appendChild(e); 
     }()); 
    </script> 

risposta

14

Subscribe to the eventauth.login. Se lo fai, Facebook chiamerà il tuo gestore dopo un accesso come è successo.

In questo gestore, use FB.api per chiamare l'API Graph per ottenere tutte le informazioni desiderate. Ad esempio, chiamando /me come mostrato nel secondo esempio otterrete le informazioni di base sull'utente che ha effettuato l'accesso.

Ora hai tutti i dati in JavaScript. Per inviarlo al tuo server, fai una semplice richiesta XMLHttpRequest/AJAX. Probabilmente la tua libreria JavaScript rende questo facile - in jQuery questo è jQuery.ajax() - ma nel peggiore dei casi puoi use XHR directly.

Ora hai i dati sul tuo server e puoi fare quello che vuoi, come memorizzarlo nel database. Se si desidera archiviare i dati solo una volta, è sufficiente controllare di non aver ancora memorizzato informazioni su tale ID utente.

+10

Per la risposta di @Jon Watte, essere consapevoli del fatto che le informazioni utente inviate tramite AJAX in questo modo c non ci si può fidare. È meglio inviare solo l'ID utente di Facebook e accedere al token al server e cercare le informazioni utente in una chiamata API sul lato server. – grossvogel

+0

Non c'è un modo più elegante con Facebook direttamente? Questa soluzione è molto insicura – basZero

3

C'è un buco in quella soluzione: ciò significa che l'utente può recuperare qualsiasi informazione che desidera e inviare un XHR sul mio server. Il server avrà bisogno di controllare direttamente con Facebook.

+0

Questo dovrebbe essere un commento, quindi ne ho aggiunto uno alla risposta sopra. – grossvogel

+0

La maggior parte dei siti utilizza l'accesso FB o l'accesso al modulo manuale. Non ha senso rendere il login FB così sicuro quando, se tutto ciò che volevano fare fosse inventare cose, potevano semplicemente usare il login del modulo manuale. Non ha senso inserire sicurezza extra su uno e non sull'altro. Qualcosa da tenere a mente: non sei mai più sicuro del tuo anello più debole. –

5

È anche possibile utilizzare una combinazione di SDK PHP e SDK JS, con quest'ultimo che esegue il login e il precedente memorizza i dati sul server. Qualcosa di simile:

<?php 
require_once 'config.php'; 
require_once 'lib/facebook.php'; 

$facebook = new Facebook(array(
    'appId' => FB_APP_ID, 
    'secret' => FB_APP_SECRET, 
)); 


?> 
<!DOCTYPE html> 
<html xmlns:fb="http://www.facebook.com/2008/fbml"> 
<body> 

<div id="fb-root"></div> 
<script> 
    window.fbAsyncInit = function() { 
     FB.init({ 
      appId:'<?php echo $facebook->getAppID() ?>', 
      cookie:true, 
      xfbml:true, 
      oauth:true 
     }); 
     FB.Event.subscribe('auth.login', function (response) { 
      window.location = "showUser.php"; //redirect to showUser.php on Login 
     }); 
     FB.Event.subscribe('auth.logout', function (response) { 
      window.location.reload(); 
     }); 
    }; 
    (function() { 
     var e = document.createElement('script'); 
     e.async = true; 
     e.src = document.location.protocol + 
      '//connect.facebook.net/en_US/all.js'; 
     document.getElementById('fb-root').appendChild(e); 
    }()); 
</script> 
<div class="fb-login-button" data-show-faces="true" data-width="200" 
    data-max-rows="1"></div> 
</body> 
</html> 

E in showUser.php hai qualcosa di simile:

<?php 
#showUser.php 
require_once 'config.php'; 
require_once 'lib/facebook.php'; 

$facebook = new Facebook(array(
    'appId' => FB_APP_ID, 
    'secret' => FB_APP_SECRET, 
)); 

$user = $facebook->getUser(); 

if($user) 
{ 
    if ($user) { 
     try { 
      // Proceed knowing you have a logged in user who's authenticated. 
      $user_profile = $facebook->api('/me'); 
      var_dump($user_profile); //You can now save this data 
     } catch (FacebookApiException $e) { 
      echo '<pre>'.htmlspecialchars(print_r($e, true)).'</pre>'; 
      $user = null; 
     } 
    } 
} 

?> 
+0

Qual è il file config.php a cui hai fatto riferimento qui? L'ID app e la chiave segreta sono già inclusi. proprio sotto l'include. –

+0

No, sotto gli include passo l'ID App e la chiave segreta al costruttore Facebook. Sono definiti in config.php – JustB

0
//very simple just change this line 
fb:login-button autologoutlink="true" 

//with this one 

fb: pulsante login autologoutlink = "true" onlogin = 'your_ajax_fun_that_store_in_db()'

function your_ajax_fun_that_store_in_db(){ 
    FB.api('/me', function(response) { 
    $.post("ajax/store_user_info.php",response, function(data) { 
    //write you js code here ! 
    //you can use the (response) from facebook directly in your store_user_info.php as it will be sent in POST array 
    }); 
}); 
} 
//last thing when you face such a problem the first thing to do is to go back to facebook reference of fun. 
Problemi correlati