2016-08-04 3 views
0

Facebookのユーザーが管理するFacebookページをFacebook Graph APIを使用して取得するコードを作成しています。私のコードは、ユーザーの承認を求めて、この情報を取得できるようにするトークンを取得し、セッションに格納します。問題は、ページをリロードすると、保存されているトークンが設定されていないため、Facebookユーザーが管理するFacebookページを取得できなくなるということです。FacebookのグラフAPIにアクセスするためのコードページをリロードするときにPHP SDKが機能しない

トークンは、ページがリロードされたときに 'validateExpiration()'関数を介して取り消されたようです。

私には何が欠けていますか?ここで

は私のコードです:

session_start(); 

// Load the Facebook PHP SDK 
require_once __DIR__ . '/facebook-sdk-v5/autoload.php'; 

define('APP_ID', 'xxxxxxxxxxxxxxxx'); 
define('APP_SECRET', 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'); 

$fb = new Facebook\Facebook([ 
    'app_id'  => APP_ID, 
    'app_secret' => APP_SECRET, 
    'default_graph_version' => 'v2.7' 
]); 

if(isset($_SESSION['fb_access_token'])) { 

    echo '$_SESSION["fb_access_token"] = ' . $_SESSION['fb_access_token'] . '<br>'; 

// Create a new AccessToken object from its string code. Needed? 
$accessToken = new Facebook\Authentication\AccessToken($_SESSION['fb_access_token']); 

    $expirationDate = $accessToken->getExpiresAt(); 
    echo 'Token expires at: ' . var_dump($expirationDate) . '<br>'; // Returns null! 

// verifies the validity and expiration of the token 
$oAuth2Client = $fb->getOAuth2Client(); 
$tokenMetadata = $oAuth2Client->debugToken($accessToken); 


try { 
    echo 'Validating token<br>'; 
    $tokenMetadata->validateAppId(APP_ID); 
    $tokenMetadata->validateExpiration(); // This apparently throws an exception 

} catch(Facebook\Exceptions\FacebookSDKException $e) { 
    echo 'I will now unset the token<br>'; 
    unset($accessToken); 
    unset($_SESSION['fb_access_token']); 
} 

if(!isset($accessToken)){ 
    echo 'Token not set!'; 
    exit; 
} 

// Check permissions 
if (isset($accessToken)) { 
    $response = $fb->get('/me/permissions', $accessToken); 

    $permissions = $response->getDecodedBody(); 
    echo 'Permissions: '; 
    print_r($permissions); 
    $permissions_list = []; 

    foreach($permissions['data'] as $perm) { 
     if($perm['status'] == 'granted') { 
      $permissions_list[] = $perm['permission']; 
     } 
    } 
    echo 'Permissions list: '; 
    print_r($permissions_list); 


    if(!in_array('pages_show_list', $permissions_list)) { 

    echo 'I will now unset the token<br>'; 
    unset($accessToken); 
    unset($_SESSION['fb_access_token']); 
    } 

} 
} else { 

$helper = $fb->getRedirectLoginHelper(); 

try { 
    $accessToken = $helper->getAccessToken(); 
} catch(Facebook\Exceptions\FacebookResponseException $e) { 
    echo 'Graph returned an error: ' . $e->getMessage(); 
    exit; 
} catch(Facebook\Exceptions\FacebookSDKException $e) { 
    echo 'Facebook SDK returned an error: ' . $e->getMessage(); 
    exit; 
} 
} 

if(isset($accessToken)) { 
// Logged in! 

// Save the string code of the AccessToken to re-create it later 
$_SESSION['fb_access_token'] = (string) $accessToken; 

echo '$_SESSION["fb_access_token"] = ' . $_SESSION['fb_access_token'] . '<br>'; 

try { 
    $response = $fb->get('/me/accounts', $accessToken); 
    $data = $response->getDecodedBody(); 
    echo '<pre>'; 
    print_r($data); 
    echo '</pre>'; 
    exit; 

} catch(Facebook\Exceptions\FacebookResponseException $e) { 
    echo 'Graph returned an error: ' . $e->getMessage(); 
    exit; 
} catch(Facebook\Exceptions\FacebookSDKException $e) { 
    echo 'Facebook SDK returned an error: ' . $e->getMessage(); 
    exit; 
} 
} else { 
$helper = $fb->getRedirectLoginHelper(); 
$permissions = ['email', 'public_profile','pages_show_list']; // Optional permissions 

$redirect_url = "https://www.example.com/this_file.php"; 
$loginUrl = $helper->getLoginUrl($redirect_url, $permissions); 
echo '<a href="' . $loginUrl . '">Log in with Facebook!</a>'; 
} 

答えて

0

私は最終的にそれを得ました!

Facebook AccessTokenは、文字列コードと有効期限付きの日時PHPオブジェクトの2つのプロパティを持つオブジェクトです。 Github repository of Facebook's PHP SDKのコードを参照してください。私が最初に新鮮なトークンを取得すると、有効期限が設定され、すべて正常に動作します。私はセッションでそのコードを保存し、

$accessToken = new Facebook\Authentication\AccessToken($_SESSION['fb_access_token']); 

でそれを再作成しようとすると、しかし、私はUNIX時間0(すなわち1970年1月1日)にどのオブジェクトのデフォルト値、有効期限を設定していませんよ。 validateExpiration()関数を呼び出した後、アクセストークンが期限切れになったことが返されます(AccessTokenオブジェクトの有効期限を調べるだけです)、例外が発生します。

解決策:保存されたトークンを再検証しないでください。 validateAppId(APP_ID)は引き続き有効です。有効期限が切れた場合は、AccessTokenオブジェクトを再作成するときにセッションを保存して使用するか、Graph APIを呼び出します。この呼び出しによってエラーが返された場合(おそらく期限切れのトークンまたはユーザーによって取り消されたアクセス許可のため)、Facebookログインを使用して新しいトークンをユーザーに問い合わせます。

関連する問題