Я использую Facebook SDK v5 для PHP и пытаюсь получить долгоживущий токен доступа USER.
Я получаю его, продлеваю один раз и сохраняю в свою базу данных, затем перехожу на другую страницу, где использую его, чтобы получить доступ к Facebook PAGE. К этому моменту все идет хорошо. Затем я обновляю свою страницу, и User AccessToken установил [«expiry at»] в 1970-01-01.
Я понятия не имею, что происходит, потому что я не переписываю этот токен доступа в базе данных. И самое главное, этот токен работает с Facebook. Итак, мой код и ответ до и после обновления.
$config = array();
$config['app_id'] = xxx
$config['app_secret'] = xxx
$config['fileUpload'] = false;
if(!empty(tokenFromDatabse)){
$config['default_access_token'] = tokenFromDatabse;
}
$fb = new Facebook($config);
$oAuth2Client = $fb->getOAuth2Client();
if(!empty(tokenFromDatabse)){
try{
$tokenMetadata = $oAuth2Client->debugToken($fb->getDefaultAccessToken());
$tokenMetadata->validateAppId($config['app_id']);
$tokenMetadata->validateExpiration();
}
Это всего лишь то, что делает это действие, конечно же, есть код catch. А теперь первый ответ от фейсбука:
object(Facebook\Authentication\AccessTokenMetadata)#689 (1) {
["metadata":protected]=>
array(7) {
["app_id"]=>
string(15) "xxx"["application"]=>
string(13) "Local_app"["expires_at"]=>
object(DateTime)#691 (3) {
["date"]=>
string(26) "2015-10-20 16:07:56.000000"["timezone_type"]=>
int(3)
["timezone"]=>
string(13) "Europe/Berlin"}
["is_valid"]=>
bool(true)
["issued_at"]=>
object(DateTime)#692 (3) {
["date"]=>
string(26) "2015-08-21 16:07:56.000000"["timezone_type"]=>
int(3)
["timezone"]=>
string(13) "Europe/Berlin"}
["scopes"]=>
array(3) {
[0]=>
string(12) "manage_pages"[1]=>
string(13) "publish_pages"[2]=>
string(14) "public_profile"}
["user_id"]=>
string(15) "xxx"}
И после обновления выглядит так:
object(Facebook\Authentication\AccessTokenMetadata)#689 (1) {
["metadata":protected]=>
array(7) {
["app_id"]=>
string(15) "xxx"["application"]=>
string(13) "Local_app"["expires_at"]=>
object(DateTime)#691 (3) {
["date"]=>
string(26) "1970-01-01 01:00:00.000000"["timezone_type"]=>
int(3)
["timezone"]=>
string(13) "Europe/Berlin"}
["is_valid"]=>
bool(true)
["issued_at"]=>
object(DateTime)#692 (3) {
["date"]=>
string(26) "2015-08-21 16:07:56.000000"["timezone_type"]=>
int(3)
["timezone"]=>
string(13) "Europe/Berlin"}
["scopes"]=>
array(3) {
[0]=>
string(12) "manage_pages"[1]=>
string(13) "publish_pages"[2]=>
string(14) "public_profile"}
["user_id"]=>
string(15) "xxx"}
Токены расширенного доступа к страницам вообще не имеют срока действия по умолчанию. А благодаря деталям реализации токен доступа пользователя, используемый для запроса расширенного токена доступа к странице, также становится действительным «на неопределенный срок».
Таким образом, значение срока действия будет 0, ноль или что-то в этом роде. И когда она отформатирована как дата, она становится 1970-01-01, так как это начало эпохи Unix.
Других решений пока нет …