如何从 Facebook 页面选项卡内部登录用户并在服务器端获取 access_token 到 post 提要的轮播?

How to login user from inside Facebook Page Tab and get access_token on server side to post a carousel to the feed?

我有一个 Page Tab facebook 应用程序。我想从中 post 到用户时间表。

在客户端使用 javascript sdk 登录后(我使用 angularjs 模块 Ciul/angular-facebook(抱歉,不能 post github link 这里)):

https://gist.github.com/Sevavietl/7e363fdfd0e714a12a43

我在服务器端检索 access_token 并尝试 post 轮播到用户提要:

https://gist.github.com/Sevavietl/cec5fa434837312adfd3

我有两个问题:

  1. 当我第一次打电话时 Graph 返回错误:(#210) Param id 必须是一个页面。

浏览后发现,这可能是token使用错误导致的。不是 user_access_token。但是我在客户端登录用户。

  1. 下一个电话我接到 图返回错误:此授权码已被使用。

再次浏览后,我发现令牌只能使用一次才能符合 OAuth。

请告诉我如何正确执行此操作?

提前致谢。

此致, 弗谢沃洛德

在这上面花了一些时间之后,我正在写我的解决方案,因为它不是很明显,至少对我来说是这样。但是,实际上,所有信息都在文档中。

从问题编号 2 开始:在接下来的调用中,我得到 Graph 返回错误:已使用此授权码。

正如评论中提到的,我确实混淆了 access_token 和授权码。正如我以真正简化的形式理解的那样,该机制是:

  1. 当您使用 facebook-javascript-sdk 登录时,它会将 authorization code 写入 cookie。
  2. 然后在服务器端,您可以从 facebook-php-sdk 中可用的 javaScriptHelper 检索 access_token。这个助手有 getAccessToken() 方法,它使用 authorization code 从 cookie 中检索 access_token。这是我感到困惑的地方。我试图在每个请求上使用 getAccessToken()。由于请求是用 AJAX 提出的,因此 authorization code 没有改变,而且你只能在我遇到错误时使用它。 网上很多地方都指出了这个问题的解决方案,但不知何故我却误解了这一点。 这是使用会话存储 access_token 的代码摘录,并且只有在会话中未设置 access_token 时才使用 getAccessToken() 方法。

        $fb = new Facebook([
            'app_id' => $widget->app_id,
            'app_secret' => $widget->app_secret,
            'default_graph_version' => 'v2.5',
        ]);
    
        $helper = $fb->getJavaScriptHelper();
    
        if ($request->session()->has('facebook_access_token')) {
            $accessToken = $request->session()->get('facebook_access_token');
        } else {
            $accessToken = $helper->getAccessToken();
    
            // OAuth 2.0 client handler
            $oAuth2Client = $fb->getOAuth2Client();
    
            // Exchanges a short-lived access token for a long-lived one
            $longLivedAccessToken = $oAuth2Client->getLongLivedAccessToken($accessToken);
            $request->session()->put('facebook_access_token', (string) $longLivedAccessToken);
            $request->session()->save();
        }
    
        if ($accessToken) {
            $fb->setDefaultAccessToken($accessToken);
        } else {
            die('No Access Token');
        }
    

我使用 Laravel,因此会话处理与框架无关。这段代码只是举例,创建服务和移动逻辑更好

现在。关于第一个问题:第一次调用时我得到 Graph 返回错误:(#210) Param id must be a page.

我又混淆了两件事'{user-id}/feed' and '{page-id}/feed'。我的目标是 post 一个 带有图像和链接的旋转木马 。要创建轮播,您必须在字段数组中提供 child_attachments。虽然您可以将这样的 Post 发送到 '{page-id}/feed',但您不能将 '{user-id}/feed' 发送给 '{user-id}/feed'因此目前您无法 post 轮播用户供稿。 因此,当 Graph Api 获得适用于 '{page-id}/feed' 的 Post 数据时,它假设我已经通过了 {page-id}。而当获得 {user-id} 时,Graph Api 大喊 "(#210) Param id must be a page.".