【问题标题】:How do I use access token for the Facebook Opengraph javascript SDK api requests?如何将访问令牌用于 Facebook Opengraph javascript SDK api 请求?
【发布时间】:2016-03-23 15:34:11
【问题描述】:

这是我第一次尝试使用 Facebook API。我正在建立一个网站,在该网站上我有一个评级和参考页面,我想在其中包含 FB 评级。

首先关于程序,我不确定我是否应该为此构建 Facebook 应用程序,并使用应用程序令牌访问,或者我是否可以使用用户或页面访问令牌。我可以在不暴露访问令牌或应用 ID 的情况下做到这一点吗?

测试"Graph Api Explorer" 中的不同用户令牌似乎允许以所有三种方式响应评分。那么我为什么需要一个应用程序呢?

function facebookLoad () {
    window.fbAsyncInit = function() {
        FB.init({
        appId      : 'xxxxxxxxxxxxxxxx',
        xfbml      : true,
        version    : 'v2.5'
        });

            FB.api(
            '/website.com',
            'GET',
            {"fields":"ratings"},
            function(response) {
                // Insert your code here
                console.log(response);

                }
            );
    };

    (function(d, s, id){
        var js, fjs = d.getElementsByTagName(s)[0];
        if (d.getElementById(id)) {return;}
        js = d.createElement(s); js.id = id;
        js.src = '//connect.facebook.net/en_US/sdk.js';
        fjs.parentNode.insertBefore(js, fjs);
    }(document, 'script', 'facebook-jssdk'));
}

到目前为止,脚本可以正常工作,因为我收到了一个响应对象。然而,该对象是一个带有以下消息的错误对象:

...
message: "An access token is required to request this resource."
type: "OAuthException"
....

显然我需要使用一个访问令牌,但是哪个?如何?我要做的就是从响应中提取评分,以便将它们放在网页上。

更新:

感谢 cmets 伙计们,让我朝着正确的方向前进(我认为)。我意识到我已经投了反对票,但我想我还是会更新,因为我还没有在其他任何地方找到真正好的答案。

function facebookLoad () {
    window.fbAsyncInit = function() {
        FB.init({
        appId      : 'xxxxxxxxxxxxxxxx',
        xfbml      : true,
        cookie     : true,
        version    : 'v2.5'
        });

    FB.getLoginStatus(function(response) {
        if (response.authResponse){

            console.log('Welcome!  Fetching your information.... ');
            FB.api('/me/accounts', 
                function(response){ 

                    var p_accessToken = response.data[0].access_token; 
                    var p_name = response.data[0].name; 

                    FB.api(
                        '/me?access_token='+p_accessToken+'',
                        'GET',
                        {"fields":"about,ratings"},
                        function(response) 
                        {     
                        /* console.log(JSON.stringify(response)); */
                        console.log(response);
                        }
                    );
                });

                } else {
                    console.log('User cancelled login or did not fully authorize.');
                }
            });

    };

    (function(d, s, id){
        var js, fjs = d.getElementsByTagName(s)[0];
        if (d.getElementById(id)) {return;}
        js = d.createElement(s); js.id = id;
        js.src = '//connect.facebook.net/en_US/sdk.js';
        fjs.parentNode.insertBefore(js, fjs);
    }(document, 'script', 'facebook-jssdk'));
}

使用上面更新的代码,我现在可以使用临时页面令牌检索带有评级的数据对象,并在使用临时登录按钮后使用 getLoginStatus 进行调用

<div class="fb-login-button" data-max-rows="1" data-size="medium" data-show-faces="false" data-auto-logout-link="false"data-scope="manage_pages,publish_pages"></div>

使用manage_pagespublish_pages 权限登录管理员,方法是将它们添加到数据范围。

不过,我仍在为这个过程而苦苦挣扎。为了让 getLoginStatus 成功执行,我需要页面访问令牌是永久的,因此我可以再次从站点中删除登录按钮。

目前我每次重置 cookie 时都需要登录,这对于测试来说很好,但不适用于生产。阅读文档部分Extending Page Access Tokens 似乎可以获得永久令牌。

那么如何在没有服务器端应用程序的情况下安全地在客户端将临时令牌换成永久令牌?

我想我应该能够以某种方式做到这一点,手动使用一次临时用户令牌。

【问题讨论】:

标签: javascript facebook facebook-graph-api facebook-javascript-sdk


【解决方案1】:

最后,在弄清楚我需要的是一个页面访问令牌之后,我放弃了尝试在客户端执行此操作,并意识到服务器端更有意义,至少在安全方面是这样。

<?php 
define('FACEBOOK_SDK_V4_SRC_DIR', __DIR__ .'/../src/Facebook/');
require_once __DIR__ .'/../src/Facebook/autoload.php';

$fb = new Facebook\Facebook([
  'app_id' => 'app_id_string',
  'app_secret' => 'app_secret_string',
  'default_access_token' => 'page_access_token_string',
  'default_graph_version' => 'v2.5',
]);

$response = $fb->get('/me?fields=ratings');
var_dump($response);
?>

我只是使用Graph Api Explorer 来永久扩展令牌。

我发现this 部分关于批处理请求的文档特别有用。

就个人而言,我不敢相信我不得不花 4 天时间来思考这个问题。老实说,我真的不喜欢 facebook 文档,但是,我可能只是愚蠢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 2014-03-30
    • 2012-07-09
    • 1970-01-01
    • 2013-02-17
    相关资源
    最近更新 更多