2017-08-03 2 views
1

私はFacebookのPHP SDK v5を使ってFacebookページにデータを投稿したいところですが、私はajaxを作るのに問題があります私のFacebookスクリプトを呼び出します。Facebook PHP SDK v5 getAccessToken()関数はどのように動作しますか

これは私のfacebook.phpファイルです:

<?php 
session_start(); 
echo facebook(); 

function facebook(){ 
    include_once $_SERVER['DOCUMENT_ROOT']."/Facebook/autoload.php"; 
    $permissions = ['manage_pages', 'publish_pages']; 
    $callback = "https://www.my-domain.com/my-callback-url.php?fb=redirect"; 

    $fb = new Facebook\Facebook([ 
     'app_id' => 'xxxxxxxxxxx', 
     'app_secret' => 'xxxxxxxxxxxxxxxxxxxxxxxxxx', 
     'default_graph_version' => 'v2.10', 
     ]); 

    $helper = $fb->getRedirectLoginHelper(); 

    try { 
     if (isset($_SESSION['facebook_access_token'])) { 
      $accessToken = $_SESSION['facebook_access_token']; 
     } else { 
      $accessToken = $helper->getAccessToken(); 
     } 
    } catch(Facebook\Exceptions\FacebookResponseException $e) { 
     $res['error'] = 'Error: Graph returned a session error: ' . $e->getMessage(); 
     return json_encode($res); 
    } catch(Facebook\Exceptions\FacebookSDKException $e) { 
     $res['error'] = 'Error: Facebook SDK returned a session error: ' . $e->getMessage(); 
     return json_encode($res); 
    } 

    if (!isset($accessToken)) { 
     $redirectUrl = $helper->getLoginUrl($callback, $permissions); 
     $res['login'] = $redirectUrl; 
     return json_encode($res); 
    }else{ 
     // rest on the script to post to a page 
    } 
} 
?> 

これはmy-callback-url.phpだけでなく、これはFacebooksのウェブサイト上でdocumentstionによるとfacebook.phpファイル

<?php 

if(isset($_GET['fb'])){ 
    $code = $_GET['code']; 
}else{ 
    $code = ''; 
} 

<script type="text/javascript"> 
jQuery(document).ready(function($) { 

var code = "<?php echo $code; ?>"; 

if(code !== ''){ 
    postToFB(code); 
} 

$('#postButton').on('click',function(){ 
    postToFB(code); 
} 

function postToFB(code){ 
    $.ajax({ 
     type: "POST", 
     url: 'facebook.php', 
     data: {"somePostData": "someValue", "redirectCode":code}, 
     success: function (data) { 
      var json = $.parseJSON(data); 
      if(json.hasOwnProperty('login')){ 
       window.location.replace(json.login); 
      } 
     } 
    }); 
} 

}); 
</script> 

?> 

にAjaxの呼び出しを行うページですどのようにFacebookはgetAccessToken()作品を言う

認証コードからアクセストークンを取得しようとします。このメソッドは、Graph APIに要求を行い、応答を返します。そのプロセスにエラーがあった場合、FacebookSDKExceptionがスローされます。 CSRFの検証に失敗した場合にも、FacebookSDKExceptionがスローされます。

私はに実行している問題は、私のユーザーがmy-callback-url.phpにあり、#postButtonをクリックしたときにfacebook.phpは、それが呼び出したアクセストークンを取得できない場合、スクリプトがfacebook.php

へのAJAX呼び出しを行います:

$redirect = $helper->getLoginUrl($callback, $permissions); 

これはmy-callback-url.phpに戻っAJAX機能に$redirect値を送信し、成功の方法は、そのリダイレクトURLにユーザーを送信します。

ユーザーが認証されると、Facebookは戻っmy-callback-url.phpにユーザーを送信し、完全なURLコールバックは、次のようなものになります。コールバックが行われた後、my-callback-url.phpが得られたコードのパラメータと一緒に再びAjaxのスクリプトを実行します

https://www.my-domain.com/my-callback-url.php&fb=redirect?code=xxxxxxxxxx?state=xxxxxxxxxx 

をコールバックから。私の質問は、facebook.phpの内部のgetAccessToken()関数にコールバックから取得したコードパラメータを渡す方法はありますか?

getAccessToken()はコードパラメータを受け入れていないようです。 getAccessToken()を読むためにコードパラメータを特定のセッション変数に設定する必要があるかどうかは疑問です。誰もこの仕事をする方法を知っていますか?

+1

_ "コールバックが行われた後、my-callback-url.phpは、コールバック" _ - から得られたコードパラメータと一緒にajaxスクリプトを再実行します。コードパラメータは、受け取ったところで直接処理する必要があります。これは 'my-callback-url.php'スクリプトにあります。そこにトークンを直接取得し、その時点でAJAXナンセンスは使用しないでください。 – CBroe

答えて

2

login-redirect URLのcodeパラメータで何もする必要はありません。

getAccessToken()メソッドは、URLクエリ文字列からコードを抽出するクラスのgetCode()メソッドを使用してコード自体を取得します。したがって、my-callback-url.phpに戻ると、メソッドを呼び出すことができ、アクセストークンが返されます。

この

はSDKにメソッド自体から見ることができます:警告の

/** 
* Takes a valid code from a login redirect, and returns an AccessToken entity. 
* 
* @param string|null $redirectUrl The redirect URL. 
* 
* @return AccessToken|null 
* 
* @throws FacebookSDKException 
*/ 
public function getAccessToken($redirectUrl = null) 
{ 
    if (!$code = $this->getCode()) { 
     return null; 
    } 

    $this->validateCsrf(); 
    $this->resetCsrf(); 

    $redirectUrl = $redirectUrl ?: $this->urlDetectionHandler->getCurrentUrl(); 
    // At minimum we need to remove the state param 
    $redirectUrl = FacebookUrlManipulator::removeParamsFromUrl($redirectUrl, ['state']); 

    return $this->oAuth2Client->getAccessTokenFromCode($code, $redirectUrl); 
} 

ただ一言:getAccessToken() -make 1つのコールに複数の呼び出しを行うと、結果を変数に格納しないでください。同じコードを使用するその後の呼び出しは、サイト間の要求偽装とみなされ、例外がスローされます。

関連する問題