2016-06-24 12 views
0

Ich habe Facebook-Login für meine Website eingerichtet und alles funktioniert, außer wenn die PHP-Sitzung abläuft. Nachdem es abgelaufen ist und ich die Seite aktualisiere, denkt meine Website, dass der Benutzer ausgeloggt ist. Nachdem eine Seite ein zweites Mal aktualisiert wurde, wird der Benutzer wieder eingeloggt. Ich gehe davon aus, dass die JavaScript-Bibliothek etwas tut. Ich möchte nicht auf die JavaScript-Bibliothek angewiesen sein, weil ich Ajax-Aufrufe mache und in der Lage sein muss, sich erneut anzumelden, wenn die Sitzung nur durch PHP abgelaufen ist.PHP Facebook v5 bekommen Sitzung von Cookie

Ich habe $ _COOKIE worden Ausdrucken Übersicht über die Facebook-Cookies zu halten, und ich sehe, dass nach der Sitzung sie noch existieren:

Array 
(
    [fbm_1575590742733556] => base_domain=.mysite.us 
    [fbsr_1575590742733556] => 1OdQYsdikidaL08RnVXbEc1ZmU3OTNBcHVDONlZEVjckVPZGZSeWZwT1Z6ZTEyVWVXaXY5b1VlSUJqMFo5UnhKRnFlMUJxV0hQMmticGVDRnBPRmt5dsafdsafsdfdsafdsafasdfdsdsafdsaZXzg1T3dmS1JIdzZ1bjRUU3pKMnEyTXF6Vm5aUazS2AtDxUav3xMNz2PAPl2dyfE.eyJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIsImNvZGUiOiJBUUF1ZVZ2UU01TkZtVUwtQXYyQXla1c1VURkYmtBbHJOdS04OWxYUWZRc0laUTd3T2xhX0RqRU5EMWh2MklBa21rTnpNZHpueTEFROVR4Yk5PYWVTbDFMZG5vMTJnaU1IS0ZPNEdHMXFYUmx6RzFWQ2tzQ0N1ZVZDU2lmYllfUEtaOGxpUktNNFM0RlBHa3pS1wLUxZQlhDVHhUMXFMWjVqNHBVdVZORVFvMGNaMmtSeUI0T202TzAwNDd2ZFhTYmRPOTU3N0VWZEczbUVyaUpkZVhPdHNzOGwtZl9Hc1JKayIsImlzc3VlZF9hdCI6MTQ2NjczNDMxMSwidXNlcl9pZCI6IjEwMTgzOTQ5MDI0NTQyNSJ9 
) 

Auf jeder Seite Last nenne ich die Funktion:

public static function CheckToken() 
    { 
     // Get a token if we dont have one 
     if (!isset($_SESSION['fb_access_token'])) 
     { 
      $helper = self::$api->getJavaScriptHelper(); 

      try { 
       // Get the acess token 
       $accessToken = $helper->getAccessToken(); 

       // OAuth 2.0 client handler 
       $oAuth2Client = FacebookProxy::$api->getOAuth2Client(); 

       // Exchanges a short-lived access token for a long-lived one 
       $longLivedAccessToken = $oAuth2Client->getLongLivedAccessToken($accessToken); 

       // Store the access token 
       $_SESSION['fb_access_token'] = (string) $longLivedAccessToken; 
      } 
      catch(Facebook\Exceptions\FacebookResponseException $e) 
      { 
       // When Graph returns an error 
       $response['errors'][] = 'Graph returned an error: ' . $e->getMessage(); 
      } 
      catch(Facebook\Exceptions\FacebookSDKException $e) 
      { 
       // When validation fails or other local issues 
       $response['errors'][] = 'Facebook SDK returned an error: ' . $e->getMessage(); 
      } 
     } 

     // Set the default access token 
     if(isset($_SESSION['fb_access_token'])) 
     { 
      self::$api->setDefaultAccessToken($_SESSION['fb_access_token']); 

      return true; 
     } 

     return false; 
    } 

    public static function SignInUser() 
    { 
     $errors = array(); 

     if(isset($_GET['test'])) echo "CHECK TOKEN"; 

     if(self::CheckToken() == true) 
     { 
      if(isset($_GET['test'])) ECHO "WE HAVE A TOKEN"; 
      // Get info about the user 
      $fbuser = self::GetMyInfo(array("id","email","name","first_name","last_name")); 

      // Check if there is already a user with this info 
      $user = User::GetBy("id_facebook", $fbuser['id']); 

      if($user->isValid() == false) 
      { 
       $errors = null; 

       $user = User::Create($fbuser['email'], null, $errors); 

       // User already exists 
       if($user == false) { 
        $user = User::GetByEmail($fbuser['email']); 
       } 
      } 

      if($user != null) 
      { 
       $user->Set("id_facebook", $fbuser['id']); 
       $user->Set("first_name", $fbuser['first_name']); 
       $user->Set("last_name", $fbuser['last_name']); 
       $user->Save($errors); 
      } 
      else 
      { 
       $errors[] = "There was an error creating your account."; 
      } 

      if(count($errors) == 0) 
      { 
       if(isset($_GET['test'])) ECHO "SIGNING IN!"; 
       $user->SignIn(); 
      } 
     } 

     if(isset($_GET['test'])) ECHO "END TOKEN"; 

     return $errors; 
    } 

Ich denke, mein Problem ist irgendwo in der CheckToken-Funktion. Gibt es eine Möglichkeit, das Token aus der Facebook-Bibliothek zu erhalten? Ist es einfach einfach, $ _SESSION ['fb_access_token'] auf die im Cookie gespeicherte Zeichenfolge zurückzusetzen? Ich nehme an, dass die Zahl nach fbsr_ dynamisch erstellt wird, wie kann ich bestimmen, was geladen wird. Wenn mehrere Benutzer authentifiziert sind, gibt es mehrere Cookies, die möglicherweise hier gespeichert werden können?

Update: ich auf die manuell versucht Zeichenfolge im Cookie gespeichert, um die Session-Token Einstellung aber, dass jetzt gibt mir Facebook Ausnahmefehler:

Fatal error: Uncaught exception 'Facebook\Exceptions\FacebookServerException' with message 'Expected 1 '.' in the input between the postcard and the payload' in facebook_v5/Exceptions/FacebookResponseException.php:105 Stack trace: #0 facebook_v5/FacebookResponse.php(210): Facebook\Exceptions\FacebookResponseException::create(Object(Facebook\FacebookResponse)) #1 facebook_v5/FacebookResponse.php(255): Facebook\FacebookResponse->makeException() #2 facebook_v5/FacebookResponse.php(82): Facebook\FacebookResponse->decodeBody() #3 facebook_v5/FacebookClient.php(225): Facebook\FacebookResponse->__construct(Object(Facebook\FacebookRequest), '{"error":{"mess...', 400, Array) #4 facebook_v5/Facebook.php(504): Facebook\FacebookClient->sendRequest(Object(Fa in facebook_v5/Exceptions/FacebookResponseException.php on line 105 

Antwort

0

Es sieht aus, als es ist nicht möglich, die Sitzung neu zu starten mit PHP ausschließlich aus dem Facebook SDK. Dies erfordert, dass die JavaScript-Bibliothek den Benutzer erneut anmeldet, da sich die Facebook-Cookies unter der Facebook-Domäne befinden.

Die Art, wie ich das angegangen bin, war Facebook-Login mit meinem eigenen Login-System zu integrieren. Wenn sich ein Nutzer bei Facebook authentifiziert, erstelle ich ihm dann einen Account und speichere das Facebook-Zugangstoken in einer Datenbank. Ich erstelle dann mein eigenes Cookie, um sie automatisch in ihr Konto einzuloggen. Wenn sie zurückkommen und ihre Sitzung kein Zugriffstoken hat, kann sie das Token in der Datenbank nachschlagen. Dieser Weg ist auch besser, denn dann können Sie Cron-Jobs immer als Benutzer ausführen (wenn Sie zum Beispiel Freunde aktualisieren oder was auch immer).

Verwandte Themen