0

ATMで作業しているアプリの認証を試してみました。アプリはタブベースになります。アプリを認証しようとしているときに、無限ループに苦しんでいます。認証手順は次のようになります。

if (!isset($_REQUEST["code"])) {
            $_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection
            $dialog_url = "http://www.facebook.com/dialog/oauth?client_id="
                    . $appId . "&redirect_uri=" . urlencode($redirectUri) . "&state="
                    . $_SESSION['state'];

            echo("<script> top.location.href='" . $dialog_url . "'</script>");
            exit;
        }

        if ($_REQUEST['state'] == $_SESSION['state']) {
            $code = $_GET["code"];
            $token_url = "https://graph.facebook.com/oauth/access_token?"
                    . "client_id=" . $appId . "&redirect_uri=" . urlencode($redirectUri)
                    . "&client_secret=" . $appSecret . "&code=" . $code;

            $response = @file_get_contents($token_url);
            $params = null;
            parse_str($response, $params);

            $graph_url = "https://graph.facebook.com/me?access_token="
                    . $params['access_token'];

            $user = json_decode(file_get_contents($graph_url));
            echo("Hello " . $user->name);
        } else {
            echo("The state does not match. You may be a victim of CSRF.");
        }

$redirectUriは「http://www.facebook.com/pages/DummyPage/PAGE_ID?sk=app_APP_ID」に設定されていますが、リダイレクトされた後、認証後、$_GETまたは$_REQUEST配列を読み取ることができません。それらは空であるため(認証後に取得するURLには、「コード」、「状態」などが含まれていることがわかりますが)。最初のifステートメントでスタックしているため、これにより無限ループが発生します。

ここで興味深いのは、$ redirectUriをアプリが置かれているURLに変更すると、現在localhostでテストしているため、「http://localhost/test/index.php」(無限ループ)を入力することです。 Facebookの外部にリダイレクトされ、$ _ GET配列から読み取ることができるため、ループは発生しません。

認証するときはFacebookにとどまる必要があります。この問題を回避する方法を知っていますか?

4

1 に答える 1

2

現在試していることには、 FacebookPHPSDKを使用してください。

それは物事をはるかに簡単にし、あなたはおそらくより短い時間であなたの目標に到達するでしょう。

また

手動で行い、内部の学習に興味がある場合は、ページタブの認証署名されたリクエストを確認する必要があります

于 2012-06-04T08:00:06.590 に答える