0

タイトルにあるように、FacebookのOAuthをlocalhost /で動作させようとしていますが、さまざまな問題に苦しんでいますが、最新の問題、つまりページが読み込まれる問題がどうなっているのかわかりません。ユーザーがログインしている場合は、ログアウトURLとUIDが表示されます。ログアウトリンクをクリックすると、Facebookからユーザーがログアウトされますが、リダイレクトまたはリロードしてもUIDが表示され、ログアウトリンクも表示されます。 。簡単に言うと、ローカルホストで実行されているサイトをFacebookやサイトからログアウトさせることができないようです。どんな考えでも途方もない助けになるでしょう。これが私のコードです

<?php

session_start();
// store session data

include "src/facebook.php";

$facebook = new Facebook(Array(
    "appId" => "xxx",
    "secret" => "xxx"
));

$user = $facebook->getUser();

echo "UID: " . $user . "<br/>";

    // THIS WAS MY FIRST TRY WHICH DIDNT SUCCEED
// if ($user) {
//  $logoutUrl = $facebook->getLogoutUrl();
//  echo "<a href='" . $logoutUrl . "'>Logout</a>";
// } else {
//  $loginUrl = $facebook->getLoginUrl();
//  echo "<a href='" . $loginUrl . "'>Login</a>";
// }

// WITH THE ABOVE CODE I GET:

// An error occurred with PHP-SDK. Please try again later.
// API Error Code: 191
// API Error Description: The specified URL is not owned by the application
// Error Message: Invalid redirect_uri: Given URL is not allowed by the Application configuration.

    // THIS WAS MY SECOND TRY AFTER SEARCHING FOR INFO, 
    // ALL I DID WAS MANUALLY ADD THE
    // REDIRECT URI AND ADDED ? , THE REASON IS IF I DIDN'T ADD IT,
    // IT WOULD GIVE ME AN CSRF ERROR
    // STATING THAT THE STATE VALUE IS NOT CORRECT, I SEARCHED FOR THE SOLUTION
    // FOR THAT PROBLEM WITH NO LUCK SO I TRIED THIS

if ($user) {
    $logoutUrl = $facebook->getLogoutUrl();
    echo "<a href='" . $logoutUrl . "'>Logout</a>";
} else {
    $loginUrl = $facebook->getLoginUrl(Array(
        "redirect_uri" => "http://localhost/php-sdk/index.php?"
    ));
    echo "<a href='" . $loginUrl . "'>Login</a>";
}

// WITH THE ABOVE CODE I NOW GET A UID AND THE LOGOUT URL DOES APPEAR, BUT ONCE I CLICK IT
// THE USER IS LOGGED OUT LIKE HE SHOULD BUT THEN ON REDIRECT OR RELOAD THE UID STILL 
// APPEARS AND SO DOES THE LOGOUT LINK, EVEN THOUGH THE USER IS NOT LOGGED IN!!

?>
4

1 に答える 1

2

これは、Facebook sdkストアがPHPセッションのユーザーIDであるためであり、Facebookのサーバーで実行されるログアウトプロセスではそれをクリアできません。次の出力を確認すると、セッションで何が保存されているかを確認できます。var_dump($_SESSION);

セッションに保存されているuidがまだログインしているかどうかを検出するには、SDKオブジェクトを使用して($facebook->api('/me'))などのグラフAPIから何かをフェッチし、例外をキャッチして、発生した場合はセッションをクリアします。

もう1つの解決策は、 (のように)呼び出しにを追加し、nextFacebookがユーザーをそのURLに戻すときに、セッション変数をクリアすることです。デフォルトのFacebook実装では、クラスにdestroySessionがあります(何らかの理由で公式のSDKドキュメントにリストされていません)。getLogoutUrl()getLoginUrl()BaseFacebook

于 2012-07-26T08:21:36.763 に答える