appsecret_proof无效 - 为什么?

时间:2015-09-16 17:15:43

标签: javascript php facebook

所以,我正在构建一个新的应用程序,使用Javascript API登录(v2.4),以及PHP API的最新版本(v5)。我为它创建了一个测试应用程序,并且正在使用它。使用Javascript API,我进行登录和身份验证,并保存我从getLoginStatus返回的访问令牌:

FB.getLoginStatus(function(response) { 
    handleLoginStatusChange(response); 
});

function handleLoginStatusChange(response)
{
    . . .
    else if (response.status == 'connected')  
    {
        // make ajax call to save access token
    . . .
}

然后,在我的PHP代码中,我拿起那个访问令牌,并尝试使用它。我也计算了一个appsecret_proof。:

$this->fb = new Facebook\Facebook([
                           'app_id'    => <my app id>,
                           'app_secret'=> <my app secret>,
                           'default_graph_version' => 'v2.3'
                                  ]);
$this->fbApp = new Facebook\FacebookApp( <my app id>, 
                                         <my app secret );

$appsecret_proof = hash_hmac('sha256', <access token>, 
                                       <app secret>); 

然后我尝试发布我的FB帐户的链接:

$linkData = [
             'link' => 'https://google.com',
             'message' => 'This is a test post',
            ];
$response = $this->fb->post('/me/feed', $linkData, <access token>);

这给了我可怕的&#34; API参数中提供的appsecret_proof无效&#34;错误。我不知道这是不是问题,但是如果我将访问令牌放入调试器,它会告诉我这个访问令牌是针对我的实际应用,而不是我的测试应用,所以appID&don?s don& #39; t匹配。如果我了解测试应用程序,我不会认为这是一个问题,特别是因为我正在使用测试appID并通过此代码测试appSecret。

有什么想法吗?我在StackOverflow上看到了一些内容,但它们或者是旧版本的API,或者是编辑API代码本身以禁用内容。

1 个答案:

答案 0 :(得分:0)

  

它告诉我此访问令牌适用于我的实际应用,而非我的测试应用,因此appID不匹配

这就是为什么它不起作用。

想想Facebook上发生的事情:他们需要用于计算app-secret证明的app秘密,因此他们必须通过app id查找。他们从哪里获得应用ID?来自访问令牌......!

因此,如果您为其他应用程序传递访问令牌,这将使他们使用错误的应用程序密钥来计算应用程序密钥证明 - 因此它将与您发送的值不匹配。

您需要使用属于测试应用的访问令牌。

(PHP SDK负责计算和发送应用程序秘密证明本身,您无需手动处理。)