3

シンプルな facebook アプリケーションは、データベース サーバー (ラッパーを使用) と通信します。セキュリティ上の理由から、サーバーに何らかのアクションを要求しているユーザーが本当に自分の ID (要求で送信された) の所有者であるかどうかを確認する必要があります。

この目的のために、サーバーへのリクエストには、javascript SDK に基づく Web アプリケーションからの access_token とユーザーの ID が含まれます。アクセストークンの所有者のIDとユーザーのIDが同じかどうかを確認したい。最初のステップは、Facebook からアクセス トークンの所有者の ID を取得することです。コードの使用:

class SessionValidator {
    private $userId;            //id of user
    private $accessToken;       //facebook user's access token
    private $fb;
    public function __construct($userId, $accessToken){
        $this->userId = $userId;
        $this->accessToken = $accessToken;
        $app_id = @appId; 
        $app_secret = @secret;

        $fb = new Facebook(array('appId' => $app_id, 'secret' => $app_secret));
        $fb->setAccessToken($accessToken);

        $this->fb = $fb;
    }
    public function authUserSession(){
        $url = 'https://graph.facebook.com/';
        $data['fields'] = $this->userId;
        $data['access_token'] = $this->accessToken;

        $response = $this->post_request($url, $data);

        return $response;
    }
    private function post_request($url, $data){
        return $this->fb->api('/me', 'POST', $data);
    }
}

Facebook は次のような反応を示しています。

キャッチされていない OAuthException: (#10) アプリケーションには、このアクションに対する権限がありません

行を削除した場合も同じ応答です: $fb->setAccessToken($accessToken);。appId と appSecure が正しいと確信しています。クライアント側のアプリとサーバー側のアプリは別のホストに配置されていますが、両方のドメインがアプリのドメインとして Facebook 開発者サイトに追加されています。このエラーを受け取った理由は何ですか?

4

1 に答える 1

8

問題は、あなたがそこにかけているあなたの電話にあります!

GET要求ではなく、要求を行う必要がありますPOST

また、fieldsキーはidユーザーの ID ではなく、その値である必要があります。

修正版は次のとおりです。

class SessionValidator {
private $userId;            //id of user
private $accessToken;       //facebook user's access token
private $fb;
public function __construct($userId, $accessToken){
    $this->userId = $userId;
    $this->accessToken = $accessToken;
    $app_id = @appId; 
    $app_secret = @secret;

    $fb = new Facebook(array('appId' => $app_id, 'secret' => $app_secret));
    $fb->setAccessToken($accessToken);

    $this->fb = $fb;
}
public function authUserSession(){
    $url = 'https://graph.facebook.com/';
    $data['fields'] = 'id';
    $data['access_token'] = $this->accessToken;

    $response = $this->get_request($url, $data);

    return $response;
}
private function get_request($url, $data){
    return $this->fb->api('/me', 'GET', $data);
}
}

値をieとしてGETリクエストを実行すると、次のようなエラーが返されます。fieldsUser's ID$this->userId

(#100) 不明なフィールド: [渡すユーザー ID]

編集:これは、ユーザー ID を確認するために使用できる別のバージョンです。ユーザー ID が facebook から返されたユーザー ID と一致する場合、メソッドは true または false を返します。返された応答で何か他のことをしている場合、これは適切なバージョンではない可能性があり、上記のバージョンを使用できます。

class SessionValidator {
    private $userId;            //id of user
    private $accessToken;       //facebook user's access token
    private $fb;
    public function __construct($userId, $accessToken){
        $this->userId = $userId;
        $this->accessToken = $accessToken;
        $app_id = @appId; 
        $app_secret = @secret;

        $fb = new Facebook(array('appId' => $app_id, 'secret' => $app_secret));
        $fb->setAccessToken($accessToken);

        $this->fb = $fb;
    }

    public function authUserSession(){
        $url = 'https://graph.facebook.com/';
        $data['fields'] = 'id';
        $data['access_token'] = $this->accessToken;

        $response = $this->get_request($url, $data);

        if($this->userId == $response['id']) {
            return true;
        }
        return false;
    }

    private function get_request($url, $data){
        return $this->fb->api('/me', 'GET', $data);
    }
}
于 2012-10-11T18:21:43.200 に答える