web-dev-qa-db-ja.com

facebook Uncaught OAuthException:現在のユーザーに関する情報を照会するには、アクティブなアクセストークンを使用する必要があります

私はこれで何が起こっているのかを見つけるのに苦労してきました。私のスクリプトは少しの間正常に機能し、突然停止しました。

APIにアクセスしていますが、アクセストークンを取得しています。アクセストークンを使用すると、ユーザーの公開情報に問題なくアクセスできます。しかし、FBアカウントに情報を投稿しようとすると、このエラーが発生します。

Fatal error: Uncaught OAuthException: An active access token must be used to query information about the current user. 

ここで何が起こっているのでしょうか?また、サイトでセッションを使用して、内部ユーザーIDを追跡しています。セッションが問題を引き起こしている可能性があるかどうかはわかりません。

これは、エラーが発生しているアップロードスクリプトです。

require 'facebook/src/facebook.php';


// Create our Application instance (replace this with your appId and secret).
$facebook = new Facebook(array(
  'appId'  => '12345678',
  'secret' => 'REMOVED',
  'fileUpload' => true, 
  'cookie' => true,
));
$facebook->setFileUploadSupport(true); 

$me = null;
// Session based API call.
if ($session) {
  try {
    $uid = $facebook->getUser();
    $me = $facebook->api('/me');
  } catch (FacebookApiException $e) {
    error_log($e);
  }
}


// login or logout url will be needed depending on current user state.
if ($me) {
  $logoutUrl = $facebook->getLogoutUrl();
} else {
  $loginUrl = $facebook->getLoginUrl();
}


$photo_details = array('message' => 'my place');
$file='photos/my.jpg'; //Example image file
$photo_details['image'] = '@' . realpath($file);
$upload_photo = $facebook->api('/me/photos', 'post', $photo_details);
54
user401183

現在のFacebookユーザーID $userを確認し、nullが返された場合は、ユーザーを再認証する必要があります(またはカスタム$_SESSIONユーザーID値を使用します-非推奨)

require 'facebook/src/facebook.php';


// Create our Application instance (replace this with your appId and secret).
$facebook = new Facebook(array(
  'appId'  => 'APP_ID',
  'secret' => 'APP_SECRET',
));

$user = $facebook->getUser();

$photo_details = array('message' => 'my place');
$file='photos/my.jpg'; //Example image file
$photo_details['image'] = '@' . realpath($file);

if ($user) {
  try {
    // We have a valid FB session, so we can use 'me'
    $upload_photo = $facebook->api('/me/photos', 'post', $photo_details);
  } catch (FacebookApiException $e) {
    error_log($e);
  }
}


// login or logout url will be needed depending on current user state.
if ($user) {
  $logoutUrl = $facebook->getLogoutUrl();
} else {
// redirect to Facebook login to get a fresh user access_token
  $loginUrl = $facebook->getLoginUrl();
  header('Location: ' . $loginUrl);
}

ユーザーのウォールに写真をアップロードする方法について チュートリアル を書きました。

31
ifaour

つかいます:

$facebook->api('/'.$facebook_uid)

代わりに

$facebook->api('/me')

できます。

32
yacon

だから私は同じ問題を抱えていたが、それはアクセストークンを保存していたがそれを使用していなかったからだ。期日のために眠いのが原因かもしれませんし、考えもしなかったかもしれません!しかし、他の誰かが同じ状況にある場合:

ユーザーをログインするときに、アクセストークンを保存します。

$facebook = new Facebook(array(
    'appId' => <insert the app id you get from facebook here>,
    'secret' => <insert the app secret you get from facebook here>
));

$accessToken = $facebook->getAccessToken();
//save the access token for later

Facebookにリクエストを送信するとき、次のようにします。

$facebook = new Facebook(array(
    'appId' => <insert the app id you get from facebook here>,
    'secret' => <insert the app secret you get from facebook here>
));

$facebook->setAccessToken($accessToken);
$facebook->api(... insert own code here ...)
18
Arjay Waran

一定の時間が経過すると、アクセストークンの有効期限が切れます。

これを防ぐには、以下に示すように、認証中に「offline_access」許可をリクエストできます。 Do Facebook Oauth 2.0 Access Tokens Expire?

4
Jeroen

私は同じ問題を抱えていましたが、ブラウザ(ctrl+shift+R)からCookieとキャッシュを消去することでこの問題を解決できます。また、アクセストークンがアクティブであることを確認する必要があります。

これが問題の解決に役立つことを願っています。

0
Faisal

同じ問題があり、解決策はユーザーを再認証することでした。ここで確認してください:

<?php

 require_once("src/facebook.php");

  $config = array(
      'appId' => '1424980371051918',
      'secret' => '2ed5c1260daa4c44673ba6fbc348c67d',
      'fileUpload' => false // optional
  );

  $facebook = new Facebook($config);

//Authorizing app:

?>
<a href="<?php echo $facebook->getLoginUrl(); ?>">Login con fb</a>

プロジェクトを保存し、テスト環境で開いたところ、再び機能しました。私がやったように、以前のコードをコメントして試してみてください。

0
Daniel

認証なしでユーザー情報を取得しようとしたときに同じ問題が発生しました。

リクエストの前にloggenを持っているかどうかを確認してください。

 $uid = $facebook->getUser();

 if ($uid){
      $me = $facebook->api('/me');
 }

上記のコードで問題を解決できます。

0
Vlad