php - Facebook 应用 : server-side access token verification

标签 php facebook authentication

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

为此,对服务器的请求包含 access_token 和来自基于 javascript SDK 的 Web 应用程序的用户 ID。我想检查访问 token 所有者的 id 和用户的 id 是否相同。第一步是从 Facebook 获取访问 token 所有者的 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 请求。

此外,您的 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 执行 GET 请求,即 $this->userId然后它会返回一个错误说:

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

编辑:这是您可以用来验证用户 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);
    }
}

关于php - Facebook 应用 : server-side access token verification,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12845720/

相关文章:

authentication - 发送用户 ID 和 access_token

php - 比较两个表中的记录

php - 组合简单的、几乎相同的选择语句

php - 在 PHP 和 MYSQLI 中互相添加列值

java - 基于 Java 的产品的身份验证解决方案

android - 如何保护 Android 应用程序中的 key ?

PHP : How to pass get value in url

facebook - 在 fb.api 状态更新中标记 friend ?

android - 如何在登录 Facebook 后打开新 Activity ?

Python facebookads sdk - 找不到publisher_platform故障