Facebook应用程序:服务器端访问令牌验证

时间:2012-10-11 17:58:40

标签: php facebook authentication

简单的facebook应用程序与数据库服务器通信(使用包装器)。出于安全原因,需要检查要求服务器执行某些操作的用户是否真的是其ID的所有者(在请求中发送)。

为此,对服务器的请求包含来自基于javascript SDK的Web应用程序的access_token和user的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开发人员站点上。知道为什么我收到这个错误吗?

1 个答案:

答案 0 :(得分: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);
}
}

如果你的GET fields请求User's ID作为$this->userId 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); } } ,那么它会返回错误说明:

  

(#100)未知字段:[您通过的用户ID]

编辑:这是您可以用来验证用户ID的另一个版本。如果用户标识与facebook返回的用户标识匹配,则该方法将返回true或false。如果您对返回的响应做了其他事情,那么这可能不适合您,您可以使用上述版本。

{{1}}