web-dev-qa-db-ja.com

Facebook PHP SDK getUserが常に0を返すのはなぜですか?

Facebookユーザーからの情報を必要とするWebサイトで作業しようとしています。PHPとJS SDKを使用しています。

PHPに関数があります:

_public function isLoggedOnFacebook() {
    $user = $this->_facebook->getUser();
    if ($user) {
        return $this->_facebook->api("/$user");
    }
    return false;
}
_

_$this->_facebook_のSDKからfacebookオブジェクトを保持しているクラス。

次に、ブロックでこれを行います:

_<?php if (!$this->isLoggedOnFacebook()): ?>
<div>
   <fb:login-button show-faces="true" perms="email" width="500" />
</div>
<?php endif ?>
_

そして、FB JS環境が適切にセットアップされている(と思う)ので、動作します。そのため、ユーザーはポップアップを取得し、サイトを承認します。

問題は、アプリがユーザーによって承認された後でも$ userは常に0です。つまり、$facebook->getUser()は常に0を返し、ログインしているユーザーを含むユーザーの顔を一覧表示しますが、 $facebook->api('/me')または何でも、無効なトークン例外をスローします。

私はこの問題を見てきましたが、解決策を見ていません。問題の場所がわからず、アイデアが足りません。

アプリセクションの開発者のFacebookページにWebサイトタブがあり、サイトURLとサイトドメインを設定できます。これが私の問題の原因だと思いますが、これらの正確な知識はありません。フィールドが含まれることになっています。

39
fd8s0

私の特定の問題に対する答えは、JS SDKのバージョンとPHP SDKを使用していて、それらをアップグレードするだけで問題が解決するという非互換性があるということでした。

この問題の症状は、さまざまなものが原因である場合に似ているため、このページで利用できるさまざまな回答を詳しく調べることができます。

0
fd8s0

私は同じ問題を抱えていましたが、それはSDKが変数$_REQUESTと私の環境では、$_GET$_POSTおよび$_COOKIE変数。

PHPバージョンに依存していると思います。だからこそ、誰かがクッキーを有効にすることで機能させたのです。

Base_facebook.phpでこのコードを見つけました:

protected function getCode() {
    if (isset($_REQUEST['code'])) {
        if ($this->state !== null &&
                isset($_REQUEST['state']) &&
                $this->state === $_REQUEST['state']) {

            // CSRF state has done its job, so clear it
            $this->state = null;
            $this->clearPersistentData('state');
            return $_REQUEST['code'];
        } else {
            self::errorLog('CSRF state token does not match one provided.');
            return false;
        }
    }

    return false;
}

そして、$ server_info変数を作成して、以下に示すように変更しました。

protected function getCode() {
    $server_info = array_merge($_GET, $_POST, $_COOKIE);

    if (isset($server_info['code'])) {
        if ($this->state !== null &&
                isset($server_info['state']) &&
                $this->state === $server_info['state']) {

            // CSRF state has done its job, so clear it
            $this->state = null;
            $this->clearPersistentData('state');
            return $server_info['code'];
        } else {
            self::errorLog('CSRF state token does not match one provided.');
            return false;
        }
    }

    return false;
}
23
Norberto Yoan

私は同様の問題に遭遇しました。 $ facebook-> getUser()は0を返し、ユーザーが実際にログインしていないときに有効なユーザーIDを返すことがあり、グラフAPI呼び出しを行おうとすると致命的なOauthエラーが発生しました。最終的にこの問題を解決しました。それが正しい方法であるかどうかはわかりませんが、動作します。

<?php
include 'includes/php/facebook.php';
$app_id = "APP_ID";
$app_secret = "SECRET_KEY";
$facebook = new Facebook(array(
    'appId' => $app_id,
    'secret' => $app_secret,
    'cookie' => true
));

$user = $facebook->getUser();

if ($user <> '0' && $user <> '') { /*if valid user id i.e. neither 0 nor blank nor null*/
try {
// Proceed knowing you have a logged in user who's authenticated.
$user_profile = $facebook->api('/me');
} catch (FacebookApiException $e) { /*sometimes it shows user id even if user in not logged in and it results in Oauth exception. In this case we will set it back to 0.*/
error_log($e);
$user = '0';
}
}
if ($user <> '0' && $user <> '') { /*So now we will have a valid user id with a valid oauth access token and so the code will work fine.*/
echo "UserId : " . $user;

$params = array( 'next' => 'http://www.anujkumar.com' );
echo "<p><a href='". $facebook->getLogoutUrl($params) . "'>Logout</a>";

$user_profile = $facebook->api('/me');
echo "<p>Name : " . $user_profile['name'];
echo "<p>";
print_r($user_profile);

} else {/*If user id isn't present just redirect it to login url*/
header("Location:{$facebook->getLoginUrl(array('req_perms' => 'email,offline_access'))}");
}

?>
5
anujkk

このブログ投稿をチェックしてください: http://thinkdiff.net/facebook/new-javascript-sdk-oauth-2-0-based-fbconnect-tutorial/

新しいJS SDKがリリースされました- https://developers.facebook.com/blog/post/525

4
Syed I.R

アプリがuri_fragmentではなくクエリ文字列からコードパラメーターを取得するように設定されていることを確認する必要があります。これは、facebookアプリページ_apps>settings>permissions_で設定できます。

$facebook->getLoginUrl()を使用してログインURLを提供しました。

3
Stephen Creasey

数時間、何時間も排水します。 Stack Overflowや他のサイトでのこれに関する投稿は、私の問題の解決策を提供しませんでした。私はついにライブラリのコードに行き、それがどこで死んでいるのかを正確に把握しました。

XAMPP for Windowsを使用する開発マシンでは、ログイン用に0を取得し続けましたが、テストサーバーは正常に動作しました。例外がスローされたが隠されていることに気付いた後、base_facebook.phpに$ e-> getMessage()を追加しました。これは、SSLエラーが発生していることを示しています。次の投稿 HTTPSおよびSSL3_GET_SERVER_CERTIFICATE:certificate verify failed、CA is OK は、私を解決に導きました。

ソリューション:

Base_facebook.phpで、curl_exec($ ch)の前に次を追加します。

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

本番システムでは上記の行は必要ないので、おそらく開発モードかどうかを判断するために使用するフラグで上記をラップする必要があります。例えば:

if ( getenv( 'environment' ) === 'development' ) {
    curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );
}
2
levans

Base_facebook.phpを介してデバッグした後、どういうわけか.crtファイルを失っていたため、アクセストークンは永久に無効です。 fb_ca_chain_bundle.crtが次の場所で利用できることを確認してください。 https://github.com/facebook/facebook-php-sdk/blob/master/src/fb_ca_chain_bundle.crt

2
Ian

設定配列を確認してください。値を設定するときは、適切な文字列の引用符を使用していることを確認してください。

$config = array();
$config["appId"] = $APP_ID;
$config["secret"] = $APP_SECRET;
$config["fileUpload"] = false; // optional

これは動作します。

$config = array();
$config[‘appId’] = 'YOUR_APP_ID';
$config[‘secret’] = 'YOUR_APP_SECRET';
$config[‘fileUpload’] = false; // optional

これは、Webサイトからの直接のコピー/貼り付け http://developers.facebook.com/docs/reference/php/ であり、奇妙な波線の引用のために機能しません。

長い答えは、アプリのシークレットが有効な値を返さないため(実際には何も返さないため)、アプリの署名を「チェック」するためのハッシュが正しいチェックに出てこないということです...したがって、hash_hmac関数は適切に一致しない不正な値を返すなど.

2
Jared Mark

ユーザーがアプリを認証しない場合、$facebook->getUser()は0を返します。

つかいます $facebook->getLoginUrlアプリを認証するためのURLを取得します。

1
Dino

Facebookアプリでもまったく同じ問題が発生していましたが、2日間髪を引っ張って欲求不満だったのでようやくわかりました。 getLoginUrl()!のredirect-uriに問題があることが判明しました。 Facebookで登録済みのアプリドメインと一致しない場合、エラーが返され、ユーザーは0(デフォルトのユーザー値)として返されます。

1
Nick

getUser()でも同じ問題があり、IE 8.で0を返します。調査を行ったところ、解決策が見つかりました。以下のリンクをたどってください。

http://www.andugo.com/facebook-php-sdk-getuser-return-0-value-on-ie/

1
Arun Karnati

私は長い間チェックし、テストしました、今、私は理由を見つけました。

settings-> Advance-> Migrations-> Deprecate offline access-で開発者アプリにログインしてください-> 無効

$ facebook-> getUser()が動作します。

別物。 facebookクラスが新しくなったときにドメインを追加した方がよいでしょう。

$facebook = new Facebook(array(
'appId' => APP_ID,//$app_id,
'secret' => APP_SECRET,//$app_secret,
'cookie' => true,
'domain'=>'xxxdomain.com',
));
$session = $facebook->getUser();    
1
Bob Jeey

あなたのコードでこれを試してください:条件がtrueの場合、facebookにリダイレクトされ、自分でログインします

if(($facebook->getUser())==0)
{
 header("Location:{$facebook->getLoginUrl(array('scope' => 'photo_upload,user_status,publish_stream,user_photos,manage_pages'))}");
 exit;
}
else {
$accounts_list = $facebook->api('/me/accounts');
echo "i am connected";
}
1
Faizan Qadri

数時間の絶望的な時間の後、サーバーで同じ問題が発生しました。SSLを使用する場合は、ポート443がブロックされていないことを確認してください!昨年ポートをオープンしましたが、最近、ウェブホスティング業者が何らかの形でリセットしたようです。

1
Ingo

私は同じ問題に直面したのでこれを解決しました。 developers.facebook.com/appsに移動し、アプリに移動して[アプリの編集]ボタンを押します。

「facebookのアプリ」にチェックマークを付けて、キャンバスのURLを入力すると、アプリは動作しません。facebookはapps.facebook.com/で動作します

私のために働いたこのチェックを削除するだけです

1
Hemen Ashodia
<?php

require 'facebook.php';

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

// Get User ID
$user = $facebook->getUser();

// We may or may not have this data based 
// on whether the user is logged in.
// If we have a $user id here, it means we know 
// the user is logged into
// Facebook, but we don’t know if the access token is valid. An access
// token is invalid if the user logged out of Facebook.

if ($user) {
  try {
    // Proceed knowing you have a logged in user who's authenticated.
    $user_profile = $facebook->api('/me');
  } catch (FacebookApiException $e) {
    error_log($e);
    $user = null;
  }
}

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

// This call will always work since we are fetching public data.
$naitik = $facebook->api('/naitik');

?>
<!doctype html>
<html xmlns:fb="http://www.facebook.com/2008/fbml">
  <head>
    <title>php-sdk</title>
    <style>
      body {
        font-family: 'Lucida Grande', Verdana, Arial, sans-serif;
      }
      h1 a {
        text-decoration: none;
        color: #3b5998;
      }
      h1 a:hover {
        text-decoration: underline;
      }
    </style>
  </head>
  <body>
    <h1>php-sdk</h1>

    <?php if ($user): ?>
      <a href="<?php echo $logoutUrl; ?>">Logout</a>
    <?php else: ?>
      <div>
        Login using OAuth 2.0 handled by the PHP SDK:
        <a href="<?php echo $loginUrl; ?>">Login with Facebook</a>
      </div>
    <?php endif ?>

    <h3>PHP Session</h3>
    <pre><?php print_r($_SESSION); ?></pre>

    <?php if ($user): ?>
      <h3>You</h3>
      <img src="https://graph.facebook.com/<?php echo $user; ?>/picture">

      <h3>Your User Object (/me)</h3>
      <pre><?php print_r($user_profile); ?></pre>
    <?php else: ?>
      <strong><em>You are not Connected.</em></strong>
    <?php endif ?>

    <h3>Public profile of Naitik</h3>
    <img src="https://graph.facebook.com/naitik/picture">
    <?php echo $naitik['name']; ?>
  </body>
</html>
1
R' Zone

これらは良い提案ですが、私のために働いたのはFacebook自体にあります。コードを何度もリファクタリングした後、Facebookの構成に問題があることに気付きました。
次の手順で問題を解決しました。

1.)[基本]> [Facebookのアプリ]で、選択を解除しました

2.)[権限]> [プライバシー]-> [公開]に設定します

権限>認証トークン->クエリ文字列に設定

3.)[詳細設定]-> [認証]> [アプリの種類]-> [Web]

3番目のステップは、実際にすべてを修正したものですが、その理由は完全にはわかりませんが、

0
isaacewing

セッション変数とCookieを使用するため、このFacebook API関数getUser before任意の出力を呼び出すようにしてください。ヘッダーを正しく送信または読み取ることができません。

0
Markus Zeller

ログインしているユーザーがいない場合、facebook-> getUser()は0を返します。 (https://developers.facebook.com/docs/reference/php/facebook-getUser/)

これを解決するために、Facebook JS SDKは、Facebook PHP SDK。

以下のJavaScriptは、Facebookログインが既に存在し、Facebookアプリが承認されているかどうかを確認します。

FB.getLoginStatus(function($response) {
    if ($response.status === 'connected') {
        var uid = $response.authResponse.userID;
        var accessToken = $response.authResponse.accessToken;
        _accessServer(uid, accessToken);

    } else if ($response.status === 'not_authorized') {
        _loginPopup();

    } else {
        _loginPopup();
    }
});

関数_accessServerは、サーバーへの別の要求を開き、アクセストークンを送信します。

関数_loginPopupは、ユーザーがアプリケーションへの「アクセスを許可する」ための適切な許可を要求するFacebookログインポップアップを開く必要があります。

PHPアプリケーションは、アクセストークンをFacebook APIに返す必要があります。

$facebook->setAccessToken($new_access_token);
$uid = $facebook->getUser();

https://developers.facebook.com/docs/reference/php/facebook-setAccessToken/

お役に立てば幸いです。

0
Henry Tseng

私もこれを見て多くの時間を費やし、解決策を見つけました。あなたには向かないかもしれませんが、$ _ SERVER ['QUERY_STRING']に問題があるようですので、$ _ REQUEST配列に設定する必要があります。

私はcodeigniterを使用していましたが、ライブラリロードの上の次のコードが機能することがわかりました。

parse_str($ _ SERVER ['QUERY_STRING']、$ _ REQUEST);

    parse_str($_SERVER['QUERY_STRING'],$_REQUEST);
    $config = array(); 
    $config["appId"] = "63xxxxx39";
    $config["secret"] = "dexxxx3bf";
    $this->load->library('facebook',$config);

    $this->user = $user = $this->facebook->getUser();
    if ($user) {

        try {
                // Proceed knowing you have a logged in user who's authenticated.
                $user_profile = $this->facebook->api('/me');
                //print_r($user_profile);exit;
        } catch (FacebookApiException $e) {
                echo '<pre>'.htmlspecialchars(print_r($e, true)).'</pre>';
                $user = null;
        }
        $logout = $this->facebook->getLogoutUrl();
        $this->fb_logout = $logout;
        $this->fb_user = $user_profile;

    } else {
        $login = $this->facebook->getLoginUrl(array("scope"=>"email","redirect_uri"=>"http://domain/login/login_fbmember/"));
        $this->fb_login = $login;
    }

}
0
karmafunk

この問題は本当に奇妙です。問題はbase_facebook.phpの静的な$ CURL_OPTS配列であることを発見しました。

これから編集してみてください:

  /**
   * Default options for curl.
   *
   * @var array
   */
  public static $CURL_OPTS = array(
    CURLOPT_CONNECTTIMEOUT => 10,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_USERAGENT      => 'facebook-php-3.2',
  );

  /**
   * Default options for curl.
   *
   * @var array
   */
  public static $CURL_OPTS = array(
    CURLOPT_CONNECTTIMEOUT => 10,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_USERAGENT      => 'facebook-php-3.2',
    CURLOPT_IPRESOLVE => CURL_IPRESOLVE_V4 
  );
0
Michelangelo

この質問がまだ人々に関連している場合、物事を機能させるためにかなりの時間を費やしたので、私は2セントを寄付したいと思います。

まず、PHPかJSかにかかわらず、あなたに合ったSDKを試してみてください。本質的には両方とも同じことを行います。ポップアップダイアログを使って、そうではありません)。lotのさまざまなチュートリアル、マニュアル、例があります!見つけるのに1週間ほどかかりました使用する予定のSDKで動作するコードを見つけたら、次は特定のニーズに合わせてコードを変更します。

コードが完成したら、テストを開始しました。 localhostでコードを実行していることに気づきましたが、配列からも結果が得られませんでした。 質問に答えるには、(サブ)ドメインにコードをアップロードして、もう一度やり直してください。私のコードは常に機能していましたが、オンラインではなかったため機能しませんでした。すでにオンラインになっている場合は、私の答えは役に立ちません。

この種の小さな話が本当にSOであることが意図されていない場合は申し訳ありませんが、それは人々を助けるかもしれません。

がんばろう!

0
Edwin Lambregts

新しいSDK 3.1.1とJSを使用する場合は、FB.initルーチンに新しい変数を追加する必要があります

oauth : true新しいOATH 2.0プロトコルを使用する!次に、パーマが許可されていないときにログインボタンを更新し、パーマではなくスコープを使用してください

0
Sascha Heim
    if ($facebook->getUser()) {
       $userProfile = $facebook->api('/me');
       // do logic
    } else {
       $loginUrl = $facebook->getLoginUrl($params = array('scope' => SCOPE));
       header('Location:' . $loginUrl);
    }

問題をどのように修正したか、今はさらに処理するためにユーザープロファイルの詳細を返しています。 (それはとても頭痛でした)

0
R T

この行を追加すると、IE9でこの問題が解決しました。

header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"'); // This is the main cause to use on IE.
0
psycho brm

getUser()およびPHP-SDKは、_REQUEST設定ミスによるhttpサーバーによるグローバルのドロップが好きです。私は間違って設定されたnginxを使用していましたが、コードを約3時間トレースした後、vhost設定の変更によりこの問題を解決しました。

ここに解決策についてのコメントを書きました: https://github.com/facebook/php-sdk/issues/418#issuecomment-2193699

お役に立てば幸いです。

0
edigu