2016-06-24 3 views
0

PHP 세션이 만료 될 때를 제외하고 내 웹 사이트에 대해 Facebook 로그인을 설정했으며 모든 것이 작동합니다. 만료 된 후 내 웹 사이트에서 사용자가 로그 아웃되었다고 생각하는 페이지를 새로 고칩니다. 페이지를 새로 고친 후 사용자가 다시 로그인하게됩니다. JavaScript 라이브러리가 수행 중이라고 가정합니다. Ajax 호출을하기 때문에 자바 스크립트 라이브러리에 의존하고 싶지 않으며 PHP를 통해 세션이 만료 된 경우 다시 로그인 할 수 있어야합니다. PHP Facebook v5 쿠키에서 세션 가져 오기

나는 페이스 북의 쿠키를 추적 할 $의 _COOKIE를 인쇄 봤는데 세션 후 그들은 여전히 ​​존재 함을 참조하십시오

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; 
    } 
: 나는 함수를 호출하는 모든 페이지로드에

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

내 문제는 CheckToken 함수 어딘가에 있다고 생각합니다. 페이스 북 라이브러리에서 토큰을 얻을 수있는 방법이 있습니까? $ _SESSION [ 'fb_access_token']을 쿠키에 저장된 문자열로 재설정하는 것이 간단할까요? 나는 fbsr_ 이후의 숫자가 동적으로 생성되어 어떻게로드할지 결정할 것이라고 가정하고 있습니다. 인증 된 사용자가 여러 명이면 여기에 여러 쿠키가 저장 될 수 있습니까?

업데이트 : 내가 수동으로 쿠키에 저장되어있는 문자열로 세션 토큰을 설정하려하지만 지금 나에게주고있다 페이스 북의 예외 오류 :

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에서 나온 것입니다. 페이스 북 쿠키가 페이스 북 도메인 아래에 있기 때문에 자바 스크립트 라이브러리가 사용자를 relogin해야합니다.

내가 접근 한 방식은 Facebook 로그인을 내 로그인 시스템과 통합하는 것이 었습니다. 사용자가 Facebook으로 인증을 받으면 계정을 만들고 Facebook 액세스 토큰을 데이터베이스에 저장합니다. 그런 다음 자신의 쿠키를 만들어 계정에 자동으로 기록합니다. 다시 돌아오고 세션에 액세스 토큰이 없으면 데이터베이스에서 토큰을 조회 할 수 있습니다. 이 방법은 사용자가 원하는 경우 (예 : 친구 업데이트 등) 항상 cron 작업을 실행할 수 있으므로 더 좋습니다.