0

facebook SDK 4.0에 문제가 있습니다.facebook SDK 4.0 PHP에서 무한 리디렉션 루프

세션/쿠키를 삭제 한 후에 문제가 해결되었습니다. 그러나 때로는, 그리고 내가 애플 리케이션에 갈 때, 그것은 끝없는 리디렉션 루프를 시작 때 결정할 수 없습니다!

문서는 정확한 ansswers 제공하지 않기 때문에 나는 자식에 내 모든 코드를 삽입했습니다

https://github.com/sandrodz/facebook-canvas-app-sample-sdk-4.0/blob/master/index.php

<?php 

// Working canvas APP, FB SDK 4.0 

session_start(); 

// Load SDK Assets 
// Minimum required 
require_once 'Facebook/FacebookSession.php'; 
require_once 'Facebook/FacebookRequest.php'; 
require_once 'Facebook/FacebookResponse.php'; 
require_once 'Facebook/FacebookSDKException.php'; 
require_once 'Facebook/FacebookCanvasLoginHelper.php'; 
require_once 'Facebook/GraphObject.php'; 
require_once 'Facebook/GraphUser.php'; 
require_once 'Facebook/GraphSessionInfo.php'; 

require_once 'Facebook/HttpClients/FacebookHttpable.php'; 
require_once 'Facebook/HttpClients/FacebookCurl.php'; 
require_once 'Facebook/HttpClients/FacebookCurlHttpClient.php'; 

use Facebook\FacebookSession; 
use Facebook\FacebookRequest; 
use Facebook\FacebookResponse; 
use Faceboob\FacebookSDKException; 
use Facebook\FacebookCanvasLoginHelper; 
use Facebook\GraphObject; 
use Facebook\GraphUser; 
use Facebook\GraphSessionInfo; 

use Facebook\HttpClients\FacebookHttpable; 
use Facebook\HttpClients\FacebookCurl; 
use Facebook\HttpClients\FacebookCurlHttpClient; 



// Facebook APP keys 
FacebookSession::setDefaultApplication('XXX','XXXXX'); 

// Helper for fb canvas authentication 
$helper = new FacebookCanvasLoginHelper(); 



// see if $_SESSION exists 
if (isset($_SESSION) && isset($_SESSION['fb_token'])) 
{ 
    // create new fb session from saved fb_token 
    $session = new FacebookSession($_SESSION['fb_token']); 

    // validate the fb_token to make sure it's still valid 
    try 
    { 
      if (!$session->validate()) 
      { 
       $session = null; 
     } 
    } 
    catch (Exception $e) 
    { 
     // catch any exceptions 
     $session = null; 
    } 
} 
else 
{ 
    // no $_SESSION exists 
    try 
    { 
     // create fb session 
     $session = $helper->getSession(); 
    } 
    catch(FacebookRequestException $ex) 
    { 
     // When Facebook returns an error 
     print_r($ex); 
    } 
    catch(\Exception $ex) 
    { 
     // When validation fails or other local issues 
     print_r($ex); 
    } 
} 



// check if 1 of the 2 methods above set $session 
if (isset($session)) 
{ 
    // Lets save fb_token for later authentication through saved $_SESSION 
    $_SESSION['fb_token'] = $session->getToken(); 

    // Logged in 
    $fb_me = (new FacebookRequest(
     $session, 'GET', '/me' 
    ))->execute()->getGraphObject(); 

    // We can get some info about the user 
    $fb_location_name = $fb_me->getProperty('location')->getProperty('name'); 
    $fb_email = $fb_me->getProperty('email'); 
    $fb_uuid = $fb_me->getProperty('id'); 
} 
else 
{ 
    // We use javascript because of facebook bug https://developers.facebook.com/bugs/722275367815777 
    // Fix from here: http://stackoverflow.com/a/23685616/796443 
    // IF bug is fixed this line won't be needed, as app will ask for permissions onload without JS redirect. 
    $oauthJS = "window.top.location = 'https://www.facebook.com/dialog/oauth?client_id=1488670511365707&redirect_uri=https://apps.facebook.com/usaidgeorgia/&scope=user_location,email';"; 
} 

?> 
내가 라인으로 디버그 라인에 나서서

, 이러한 나의 발견됩니다 :

// see if a existing session exists 
if (isset($_SESSION) && isset($_SESSION['fb_token'])) 
{ 
    echo '$_SESSION and $_SESSION["fb_token"] are set'; 

    // create new session from saved access_token 
    $session = new FacebookSession($_SESSION['fb_token']); 

    // validate the access_token to make sure it's still valid 
    try 
    { 
     if (!$session->validate()) 
     { 
      $session = null; 
      echo 'access_token is not valid'; 
     } 
     echo 'access_token is valid'; 
    } 
    catch (Exception $e) 
    { 
     // catch any exceptions 
     $session = null; 
     echo 'something error happened ' . $e; 
    } 
} 

내가 얻을 오류 :

$_SESSION and $_SESSION["fb_token"] are setsomething error happened exception 'Facebook\FacebookSDKException' with message 'Session has expired, or is not valid for this app.' in /home2/nakaidze/public_html/mesamoqalaqo_app/Facebook/FacebookSession.php:247 Stack trace: #0 /home2/nakaidze/public_html/mesamoqalaqo_app/Facebook/FacebookSession.php(221): Facebook\FacebookSession::validateSessionInfo(Object(Facebook\GraphSessionInfo), '148867051136570...') #1 /home2/nakaidze/public_html/mesamoqalaqo_app/user-functions.php(56): Facebook\FacebookSession->validate() #2 /home2/nakaidze/public_html/mesamoqalaqo_app/index.php(2): require('/home2/nakaidze...') #3 {main} 

답변

1

$_SESSION['fb_token']에 사용중인 액세스 토큰이 만료되었습니다. 기본적으로 Facebook에서 반환 한 액세스 토큰은 2 시간 동안 지속 된 다음 만료됩니다. 또한

$session = $helper->getSession(); 
$accessToken = $helper->getAccessToken(); 
$longLivedAccessToken = $accessToken->extend(); 
$_SESSION['fb_token'] = (string) $longLivedAccessToken; 

당신이 validate()에 액세스 토큰의 유효성을 검사 할 때, 그것은 것입니다 : 당신이 처음 FacebookSession을 얻을 후

, 당신은 반환 된 액세스 토큰을 확장하고 $_SESSION['fb_token']하여 저장해야 유효하지 않은 경우 던져주세요.

// validate the access_token to make sure it's still valid 
try 
{ 
    $session->validate(); 
    echo 'access_token is valid'; 
} 
catch (FacebookSDKException $e) 
{ 
    $session = null; 
    echo 'Access token is no longer valid, need to get a new token'; 
} 

Facebook access tokens에 대한 정보를 명확히하는 데 도움이 될 수 있습니다.