我在这里疯了,
我不明白facebook如何处理令牌事物。我使用php sdk进行网络登录。这有效,我可以用
$facebook->api('/me');
来自用户等的数据
但是很短的时间后我确实得到了 * fb错误:
OAuthException: An active access token must be used to query information about the current user.
即使用户仍然登录。当我断开连接并再次登录facebook时,我没有获得新令牌(我认为因为cookie仍处于活动状态?)
当我删除所有cookie时,它会工作一段时间。
当我使用JS SDK检查时,但是
FB.getLoginStatus(function(response){FB.api('/me', function(response) {});});
我总是有一个活动的access_token,在其中我可以调用api,但只能在...内
为什么我不能在php和js中使用相同的标记或为什么它们不同?????
请帮帮我。
修改
更好地解释它。在php中,access_token从例如: 'CDAtEg'等到'148234'等(不知道为什么)。如果我在php中执行api请求我得到了OAuthException,但是在js SDK中,旧令牌'CDAtEg'仍处于活动状态,我得到了user_data,直到令牌到期。
为什么我不能再次在php中使用相同的令牌以及为什么删除它?我没有找到原因。
编辑2
到目前为止,感谢您的想法。我现在发现了两件事。首先,当我保存令牌时,我从JS SDK中获取并与
一起使用$facebook->setAccessToken()
到目前为止它似乎有效。第二,当phwd发布在我从php获得的user_access令牌下面2,3分钟后被删除。我怎样才能找到这个问题的根源?
答案 0 :(得分:1)
两个令牌都会过期,因为它们是相同的用户令牌。
在PHP SDK中,如果令牌过期或因某些错误而被抛出,PHP SDK会将默认令牌设置为应用程序令牌
https://github.com/facebook/facebook-php-sdk/blob/master/src/base_facebook.php#L389
/**
* Determines the access token that should be used for API calls.
* The first time this is called, $this->accessToken is set equal
* to either a valid user access token, or it's set to the application
* access token if a valid user access token wasn't available. Subsequent
* calls return whatever the first call returned.
*
* @return string The access token
*/
public function getAccessToken() {
if ($this->accessToken !== null) {
// we've done this already and cached it. Just return.
return $this->accessToken;
}
// first establish access token to be the application
// access token, in case we navigate to the /oauth/access_token
// endpoint, where SOME access token is required.
$this->setAccessToken($this->getApplicationAccessToken());
$user_access_token = $this->getUserAccessToken();
if ($user_access_token) {
$this->setAccessToken($user_access_token);
}
return $this->accessToken;
}
因此,您必须在PHP中引入登录处理,以确保除非提供有效的用户访问令牌,否则不会进行任何调用。
在JS SDK中,大多数设置除非你明确设置否则会在令牌到期后推动用户登录。
正如您所描述的那样,似乎错误是推动PHP SDK使用默认的应用程序令牌。
您甚至可以确定JS SDK中使用的用户访问令牌可以在PHP SDK 中工作,如果它确实仍处于活动状态,通过设置它
$facebook->setAccessToken('YOUR_ACCESS_TOKEN_IN_JS_SDK');
一旦这样做,那么代码中的其他地方的错误(你没有提供)。
答案 1 :(得分:0)
经过一段时间间隔访问令牌过期后。 Facebook为每个会话提供新的访问令牌。每个用户和每个会话的访问令牌并不总是相同。
答案 2 :(得分:0)
但是当我用facebook SDK检查时
这是因为FB.api
检查是您的access_token
有效且无效的更新。
在php中,您需要手动执行此操作。更多代码示例PHP SDK: How do I capture the access token after user auths app?