2016-06-24 6 views
0

У меня установлена ​​учетная запись Facebook для моего сайта, и все работает, за исключением случаев, когда истекает срок действия PHP-сессии. По истечении этого срока я обновляю страницу, на которой мой сайт считает, что пользователь вышел из системы. После обновления страницы второй раз он регистрирует пользователя. Я предполагаю, что это то, что делает библиотека JavaScript. Я не хочу полагаться на библиотеку JavaScript, потому что я делаю вызовы Ajax, и он должен иметь возможность переписывать, если срок действия сеанса истек только через PHP.PHP Facebook v5 получить сеанс из файла cookie

Я распечатывание $ _COOKIE следить за кук Facebook, и я вижу, что после сессии они все еще существуют:

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

На каждой странице я вызываю функцию:

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; 
    } 

Я думаю, что моя проблема находится где-то в функции CheckToken. Есть ли способ получить токен из библиотеки Facebook? Просто спросите, как сбросить $ _SESSION ['fb_access_token'] в строку, хранящуюся в файле cookie? Я предполагаю, что число после fbsr_ динамически создается, так как я могу определить, что загрузить. Если есть несколько пользователей, прошедших проверку подлинности, это их несколько файлов cookie, которые потенциально могут быть сохранены здесь?

Update: я вручную попытался установить маркер сеанса в строке, хранящейся в куки, но что теперь дает мне Facebook исключения ошибок:

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 

ответ

0

Это выглядит так, как его не представляется возможным, чтобы перезапустить сеанс с PHP строго из SDK. Это требует, чтобы библиотека JavaScript переписывала пользователя, поскольку файлы cookie Facebook находятся в домене Facebook.

Способ, которым я подходил, заключался в интеграции входа в Facebook с моей собственной системой входа. Когда пользователь аутентифицируется с помощью Facebook, я затем создаю им учетную запись и сохраняю токен доступа Facebook в базе данных. Затем я создаю свой собственный файл cookie, чтобы автоматически записывать их в свою учетную запись. Если они вернутся и их сеанс не будет иметь токен доступа, он сможет искать токен в базе данных. Этот способ также лучше, потому что тогда вы всегда можете запускать задания cron в качестве пользователя, если это необходимо (например, обновление друзей или что-то еще).

Смежные вопросы