【问题标题】:Facebook app: server-side access token verificationFacebook 应用:服务器端访问令牌验证
【发布时间】:2012-10-11 17:58:40
【问题描述】:

简单的 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 开发人员网站上。知道为什么我会收到此错误吗?

【问题讨论】:

    标签: php facebook authentication


    【解决方案1】:

    问题在于你在那里打的电话!

    您应该发出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);
    }
    }
    

    如果您使用fields 值作为User's ID$this->userId 执行GET 请求,那么它将返回一条错误消息:

    (#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-06-05
    • 2011-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    • 2017-12-28
    • 2011-07-08
    • 2015-10-23
    相关资源
    最近更新 更多