无效的appsecret_proof -为什么

Invalid appsecret_proof - why?

本文关键字:为什么 proof appsecret 无效      更新时间:2023-09-26

所以,我正在构建一个新的应用程序,使用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>);

这给了我可怕的"无效的appsecret_proof提供在API参数"错误。我不知道这是不是问题,但如果我把访问令牌放入调试器,它会告诉我这个访问令牌是针对实际应用的,而不是测试应用,所以appID不匹配。我不认为这是一个问题,如果我了解测试应用程序,特别是因为我在整个代码中使用了测试appID和测试appSecret。

任何想法?我在StackOverflow上看到了一些东西,但它们要么是旧版本的API,要么是在谈论编辑API代码本身来禁用这些东西。

它告诉我这个访问令牌是针对实际应用的,而不是测试应用的,所以appID不匹配

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

想想Facebook这边发生了什么:他们需要用于计算应用秘密证明的应用秘密,所以他们必须通过应用id来查找。他们从哪里获得应用id ?从访问令牌…!

所以如果你传递一个访问令牌给一个不同的应用程序,这将使他们使用错误的应用程序的秘密来计算应用程序的秘密证明-所以它不会匹配你发送的值。

你需要使用一个属于测试应用的访问令牌。

(PHP SDK负责计算和发送应用程序的秘密证明,你不需要手动处理。)