2

こちら で説明されているように、Facebook PHP SDK を使用し、Javascript を使用せずにサーバー間の認証フローを構築しようとしています。これまでのところ、ユーザーが Facebook でサインインし、アプリにリダイレクトして、CSFR 保護の状態パラメーターを確認できるようにする LoginUrl を正常に作成しました。

私の問題は、認証コードをアクセス トークンに交換する API 呼び出しが機能していないように見えることです。考えられる解決策として、Google が見つけた他の誰かが遭遇した同様の問題をすべて略奪しました。それでも、最終結果は常に同じでした。アクセス トークンがなく、評価できるエラー メッセージもありませんでした。

このトピックを調査したところ、次のアドバイスが得られました。これをテストしました。

  • アプリ設定で指定された URL は、 の親フォルダーである必要があります$appUrl
  • SDK関数の代わりにcurlを使用してリクエストを行いますapi()

私はこれを2日間続けて行ってきましたが、本当に助けが必要です.

<?php

require '../inc/php-sdk/src/facebook.php';
// Setting some config vars

$appId = 'MY_APP_ID';
$secret = 'MY_APP_SECRET';
$appUrl = 'https://MY_DOMAIN/appFolder';
$fbconfig = array('appId'=>$appId, 'secret'=>$secret);

$facebook =  new Facebook($fbconfig);

// Log User in with Facebook and come back with Auth Code if not yet done
if(!(isset($_SESSION['login']))){
    $_SESSION['login']=1;
    header('Location: '.$facebook->getLoginUrl());
}
// process Callback from Facebook User Login
if($_SESSION['login']===1) {
    /* CSFR Protection: getLoginUrl() generates a state string and stores it 
in "$_SESSION['fb_'.$fbconfig['appId'].'_state']". This checks if it matches the state 
obtained via $_GET['state']*/
    if (isset($_SESSION['fb_'.$fbconfig['appId'].'_state'])&&isset($_GET['state'])){
        // Good Case
        if ($_SESSION['fb_'.$fbconfig['appId'].'_state']===$_GET['state']) {
            $_SESSION['login']=2;
        }
        else {
            unset($_SESSION['login']);
            echo 'You may be a victim of CSFR Attacks. Try <a 
href="'.$facebook->getLoginUrl().'">logging in</a> again.';
        }
    }
}

// State check O.K., swap Code for Token now
if($_SESSION['login']===2) {
    $path = '/oauth/access_token';
    $api_params = array (
            'client_id'=>$appId,
            'redirect_uri'=>$appUrl,
            'client_secret'=>$secret,
            'code'=>$_GET['code']
    );
    $access_token = $facebook->api($path, 'GET', $api_params);
    var_dump($access_token);
}
4

1 に答える 1

1

これを行う最も簡単な方法は、Facebook クラスを拡張し、保護された getAccessTokenFromCode() メソッドを公開することです。

<?php

class MyFacebook extends Facebook {

    /** If you simply want to get the token, use this method */
    public function getAccessTokenFromCode($code, $redirectUri = null)
    {
        return parent::getAccessTokenFromCode($code, $redirectUri);
    }

    /** If you would like to get and set (and extend), use this method instead */
    public function setAccessTokenFromCode($code)
    {
        $token = parent::getAccessTokenFromCode($code);
        if (empty($token)) {
            return false;
        }
        $this->setAccessToken($token);
        if (!$this->setExtendedAccessToken()) {
            return false;
        }
        return $this->getAccessToken();
    }

}

また、アクセス トークンを設定するために使用する便利なメソッドのバリエーションも含めました。これは、実際には自分のコードでパブリックな「get」メソッドを必要としないためです。

于 2013-11-22T20:27:40.373 に答える