Facebook给了我两个不同的acces令牌,PHP SDK


Facebook gives me two different acces tokens, PHP SDK

我使用Yii作为框架,但我认为这并不重要。

在这一点上,我使用PHP SDK从用户那里获取帐户信息,当我的用户第一次登录时,这很好。但在1或2小时后,访问令牌过期,我收到一个错误(这并不奇怪)。

但这是我陷入困境的地方,我可以想出两个解决方案,但我都不知道如何做到。首先让我介绍一下我的一些代码:

要登录到我的应用程序,用户将被发送到FacebookLogin()操作:

public function actionFacebookLogin()
{
    $my_url = 'http://***.***.nl/app/facebook-popup.php';
    $permissions = 'read_insights, publish_actions, manage_pages, email';
    $loginUrl = Yii::app()->facebook->getLoginUrl(array('scope' => $permissions, 'display' => 'popup', 'redirect_uri' => $my_url));
    echo '<script> window.location="'.$loginUrl.'"</script>';
}

在用户授予适当的权限后,将用户发送到Login()操作:

public function actionLogin() {
    $facebookID = Yii::app()->facebook->getUser();  
    $accessToken = Yii::app()->facebook->getAccessToken();
}

(登录操作的其余部分并不重要。)

现在,->getAccessToken()函数为我提供了一个使用寿命较短的适当的access_token。除非用户在我的页面上停留的时间超过1或2个小时,否则这是可以的,"现在有些奇怪的事情*之后用户必须注销并再次登录。然后我仍然会收到错误,除非大约10分钟后我得到了一个新的access_token,它确实授予了我所需的权限。

所以为了解决这个问题,我想到了两个解决方案,但我找不到合适的方法来使用它。

首先是最简单的一个。当我转到Graph API资源管理器并使用我的应用程序提供的access_token时,我会得到信息,但当我尝试调试该access_toke时,它显示access_token有一个导出日期。但是当我使用相同的Graph API资源管理器并让它自己生成一个access_token时,我得到一个根本不会过期的access_toke。

按要求更新我使用Graph API资源管理器的处理我转到API资源管理器,将应用程序更改为我的网络应用程序。然后它自动填写了一个正常的access_token。当我按下"调试"按钮时,它显示这个access_token有一个到期日期。当我回到浏览器并按下"获取访问令牌"按钮时,它会给我另一个令牌。当我再次按下"调试"按钮时,它显示这个access_token没有到期日期。如果我能用这个就太好了。

因此,我的第一个解决方案是获取最后一个access_token(如果可能的话)并将其存储在我的数据库中。然后在需要时使用Facebook PHP SDK ->setAccessToken()函数。但是怎么做呢??我一点都不知道!

我想到的第二个解决方案。我还可以制作一个init()函数,如果我们得到了一个有效的access_token,它会检查每个操作,如果没有得到一个新的,或者刷新过期的当前操作。与第一个解决方案相比,这将有更多的服务器负载,与第一个方案相同,我不知道如何实现这一点。

我认为主要的问题是我发现Facebook的文档有点难以理解,而且我不知道从哪里开始。

如有任何意见,我们将不胜感激!

您可以延长访问令牌的到期时间,如下所述:https://developers.facebook.com/roadmap/offline-access-removal/

或者你可以嵌入JS SDK,如果前一个访问令牌已经过期,它在每次页面调用中都会获得一个新的短期访问令牌。(并通过cookie与PHP SDK共享。)