微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – Facebook app:服务器端访问令牌验证

简单的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一直在回应:

Uncaught OAuthException: (#10) Application does not have permission
for this action

如果我删除了行,则回复相同:$fb-> setAccesstoken($accesstoken);.我确定appId和appSecure是正确的.客户端应用程序和服务器端应用程序放置在不同的主机上,但这两个域都作为应用程序域添加到Facebook开发人员站点上.知道为什么我收到这个错误吗?

解决方法:

问题出在你打电话的时候!

您应该执行GET请求而不是POST请求.

您的字段键也应该是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);
}
}

如果您使用字段值作为用户ID进行GET请求,即$this-> userId,那么它将返回错误说:

(#100) UnkNown fields: [User ID you Pass]

编辑:这是您可以用来验证用户ID的另一个版本.如果用户标识与facebook返回的用户标识匹配,则该方法将返回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);
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐