Facebook身份验证令牌在注销后停止工作


Facebook auth token stops working after logging out

我正在使用以下URL来获取用于管理页面和页面事件的Facebook身份验证令牌...

https://www.facebook.com/dialog/oauth?client_id=CLIENTID&redirect_uri=REDIRECTURL&scope=manage_pages,create_event&response_type=token

这将完成授权过程并返回令牌,该令牌保存在我的数据库中。然后,我尝试执行以下操作来检索参加某个主页活动的用户的缩略图...

function fbEventRSVPPhotos($eventID){
    $authToken = eto_get_option('eto_auth_fbauthtoken') //pulled from database;
    $json = file_get_contents("https://graph.facebook.com/" . $eventID ."/attending?access_token=" . $authToken);
    $attendees = json_decode($json, true);
    echo '<div class=attendee-photos>';
    foreach($attendees['data'] as $attendee) {
        echo '<img class="facebook-thumb toggleTooltip" title="' . $attendee['name'] . ' is attending" src="https://graph.facebook.com/' . $attendee['id'] . '/picture?type=square">';
    }
    echo '</div>';
}

此功能非常适合我登录Facebook时,但是一旦我注销,我就会得到以下信息...

Warning: file_get_contents(https://graph.facebook.com/MYEVENTID/attending?access_token=MYTOKEN) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.0 400 Bad Request in PATHTOSCRIPT on line 94 Warning: Invalid argument supplied for foreach() in PATHTOSCRIPT on line 97

然后,即使在重新登录后,它也会继续显示此PHP错误。我基本上必须在每次重新登录时重新生成身份验证令牌。

有人可以帮助我了解为什么会发生这种情况以及如何解决吗?

您希望销毁会话$facebook->destroySession(),而不是使令牌无效。注销是使令牌失效的方法之一。这是预期的操作。

销毁会话会将用户从应用中注销,但不会使令牌失效。看到您正在将其保存到数据库,您可能请求访问时间超过两个小时,这超出了短期令牌的限制。

此外,当您使用页面时,您可以在 https://developers.facebook.com/roadmap/offline-access-removal/中使用方案 5

当用户向应用授予manage_pages权限时,该应用能够 获取用户管理的页面的页面访问令牌 查询 [用户 ID]/帐户图形 API 端点。随着迁移 启用,当使用短期用户访问令牌查询此令牌时 终结点,获取的页面访问令牌也是短暂的。

将短期用户访问令牌交换为长期访问 令牌使用前面介绍的终结点和步骤。通过使用 长期用户访问令牌,查询 [用户 ID]/帐户端点 现在将为以下页面提供不会过期的页面访问令牌 用户管理。这也适用于使用未过期的查询 通过已弃用offline_access获取的用户访问令牌 许可。