1

これは、新しい (最新の) Facebook PHP SDK を使用する Facebook プラットフォームのキャンバス アプリ用です。

Facebook チュートリアル (https://developers.facebook.com/docs/appsonfacebook/tutorial/) の PHP の例を使用して、OAuth ダイアログをトリガーし、テスト ユーザーにリダイレクト URL を取得します。

リダイレクト URL では、Facebook の署名付きリクエスト ドキュメント ページ (https://developers.facebook.com/docs/authentication/signed_request/) の PHP の例を使用し、テスト ユーザーはアプリを正常に承認できます。

ただし、テスト ユーザーがアプリを認証した後は、アクセス トークンとその有効期限を取得できません。リダイレクト URL に追加されたアドレス バーに表示されますが、$_REQUEST 配列には表示されません。{$access_token = $facebook->getAccessToken();} をリダイレクト URL ページに追加すると、アクセス トークンの値が表示されますが、表示される値は [表示] をクリックしたときに表示される完全なトークン文字列ではありません。 [ユーザー ロールのテスト] ページのトークン (これがテスト ユーザーの正しいアクセス トークンであると考えられます)。

アクセス トークンが追加されたリダイレクトURL の例を次に示します。 7Y&expires_in=6008

同じページの $ REQUEST 配列に対してvar_dump が表示する内容は次のとおりです。 30" ["PHPSESSID"]=> 文字列(26) "euois02ead39ijumca7nffblh2" }

$_REQUEST 配列が URL に追加された値と異なる理由、さらに重要なこととして、アクセス トークンとその有効期限を取得する方法がわかりません。

誰かがリダイレクト ページで parse_signed_request($signed_request, $secret) 関数を実行した後にこのデータをキャプチャする方法の実例を示すことができますか? ありがとう!

追加情報:

以下は、A) テスト インデックス ページと B) テスト リダイレクト ページの関連コードです。テキスト インデックス ページをリダイレクト URL として使用すると、ユーザーが識別されないため、無限ループに陥ります。

A) インデックスページ

// Create kk-fb app instance
$facebook = new Facebook(array(
    'appId'  => KKFB_ID,
    'secret' => KKFB_KY,
    'oauth' => true,
));

$app_id = KKFB_ID;
$secret = KKFB_KY;
$canvas_auth = 'http://karmakorn.com/karmakorn/alpha20/kk-fb-auth.php';

$auth_url = "https://www.facebook.com/dialog/oauth?" 
                . "client_id=" . $app_id 
                . "&redirect_uri=" . urlencode($canvas_auth) 
                . "&response_type=token" 
                . "&scope=email,publish_stream";

$signed_request = $_REQUEST["signed_request"];

list($encoded_sig, $payload) = explode('.', $signed_request, 2); 

$data = json_decode(base64_decode(strtr($payload, '-_', '+/')), true);

if (empty($data["user_id"])) {
    echo("<script> top.location.href='" . $auth_url . "'</script>");
} else {
    echo ("Welcome User: " . $data["user_id"]);
}

B) ページをリダイレクト

// Create kk-fb app instance
$facebook = new Facebook(array(
    'appId'  => KKFB_ID,
    'secret' => KKFB_KY,
    'oauth' => true,
));

$app_id = KKFB_ID;
$secret = KKFB_KY;

$signed_request = $_REQUEST["signed_request"];

list($encoded_sig, $payload) = explode('.', $signed_request, 2); 

$data = json_decode(base64_decode(strtr($payload, '-_', '+/')), true);

$user = $facebook->getUser();
$access_token = $facebook->getAccessToken();

echo "User: $user <br>";
echo "Access Token: $access_token <br>";
echo "Signed Request: $signed_request <br>";
var_dump($_REQUEST);

これらのエコー結果として表示されるものは次のとおりです。

ユーザー: 0 アクセス トークン: 126736467765| ** SECRET ** 署名付きリクエスト: array(3) { ["_ qca"]=> string(26) "P0-709927483-1291994912966" [" _switchTo5x"]=> string(2) "30" ["PHPSESSID" ]=> 文字列(26) "frugi545cdl15gjind1fnv6pq1" }

興味深いことに、テスト ユーザーがインデックス ページに戻ると、if 条件が満たされ、正しいアクセス トークンを取得できます。

ウェルカム ユーザー: 100002908746828 アクセス トークン: 126736467765|2.AQBgcyzfu75IMCjw.3600.1315544400.1-100002908746828|m5IYEm976tJAkbTLdxHAhhgKmz8

明らかに、まだ何かが足りない!? また、有効期限を変数として取得する方法も学ぶ必要があるため、これらの両方をデータベースに保存できます。

4

4 に答える 4

13

よし、もう一度やってみよう。

サーバー側とクライアント側の認証

PHP SDK のみを使用しているため、サーバー側の認証を行う必要があります。この認証コードは、HTTP 経由で URL 経由でサーバーに送信されます。これにより、認証後の最初のページ読み込み (この場合はリダイレクト ページ) でユーザーのアクセス トークンを取得できます。現在作成中の auth_url は setting ですresponse_type=token。これにより、リダイレクトでクライアント側の認証モードが使用され、クエリではなく URL フラグメントにトークンが設定されます。そのパラメータを完全に削除する必要があります。実際、URL を自分で作成するのではなく、PHP SDK を使用することを強くお勧めします。以下の例を参照してください。

アプリケーション アクセス トークン

奇妙に見えるアクセス トークン 126736467765| SECRETはアプリケーション アクセス トークンで、アプリ ID と秘密鍵で構成されます。アプリケーション アクセス トークンは、利用可能なユーザー アクセス トークンがない場合に によって返されgetAccessToken()ます (一部の API 呼び出しでは、少なくとも何らかのアクセス トークンが必要になるため)。これは、このブログ投稿を通じて秘密鍵を世界に公開したことも意味するため、アプリの秘密をリセットする必要があります。そうしないと、だれでもあなたに代わって API 呼び出しを行うことができます。アクセス トークンを他のユーザーと共有する場合は、その一部を削除することを強くお勧めします。

トークンの有効期限

OAuth 2.0 フローと PHP SDK の v3.1.1 では、トークンの有効期限を簡単に判断することはできません。API 呼び出しを試み、 API呼び出しがOAuthException. トークンは有効期限が切れていなくても無効になる可能性があるため、これはより多くのケースに対処します。ただし、有効期限を維持したい場合は、トークン自体から抽出することをお勧めします。期限切れのトークンがある場合、有効期限のタイムスタンプはその文字列に含まれます。これを抽出するためにすぐにまとめた関数を次に示します。

function extractExpirationFromToken($access_token) {
    $segments = explode('|', $access_token);
    if(count($segments) < 2) { return 0; }

    $segments = explode('.', $segments[1]);
    if(count($segments) < 4) { return 0; }

    $expires = $segments[3];
    $dash_pos = strrpos($expires, '-');
    if($dash_pos !== false) {
        $expires = substr($expires, 0, $dash_pos);
    }
    return $expires;
}

新しいインデックス ページ コード

// Create kk-fb app instance
$facebook = new Facebook(array(
    'appId'  => KKFB_ID,
    'secret' => KKFB_KY,
));

$canvas_auth = 'http://karmakorn.com/karmakorn/alpha20/kk-fb-auth.php';

$auth_url = $facebook->getLoginUrl(array(
    'scope' => 'email,publish_stream',
    'redirect_uri' => $canvas_auth, // you could just redirect back to this index page though
));

$user = $facebook->getUser();

if (empty($user)) {
    echo("<script> top.location.href='" . $auth_url . "'</script>");
} else {
    echo ("Welcome User: " . $user);
}

ページをリダイレクト

このページはまったく必要ないと思います。ユーザーを元のインデックス ページにリダイレクトするだけです。

// Create kk-fb app instance
$facebook = new Facebook(array(
    'appId'  => KKFB_ID,
    'secret' => KKFB_KY,
));

$user = $facebook->getUser();
$access_token = $facebook->getAccessToken();
// also copy the function definition given earlier
$expiration = extractExpirationFromToken($access_token);

echo "User: $user <br>";
echo "Access Token: $access_token <br>";
echo "Expiration: $expiration <br>";
echo "Request: <br>";
var_dump($_REQUEST);
于 2011-09-09T21:15:08.707 に答える
2

たとえば、メソッド getAccessToken() で facebook ビルドを使用できます。

$access_token = $facebook->getAccessToken();

これにより、変数へのアクセストークンが得られます。空になっている場合は、最初にfuidが適切にキャッチされているかどうかを確認してください。そうでない場合は、設定を確認して「アプリドメイン」を確認してくださいこの部分が設定されている場合、正しく設定した後は非常に重要です。アプリ シークレットをリセットしてから、認証コードに新しい値を設定する必要があります。この助けを願って、私に知らせてください:)

pd。また、変数のスコープを php ファイルまたはクラス全体で見えるようにしておくことを忘れないでください。

于 2011-09-08T22:56:47.090 に答える
1

問題

貼り付けた URLのaccess_tokenはクエリ文字列の一部ではなく、URL フラグメント (# の後) に含まれています。URL フラグメントは Web サーバーに送信されず、Javascript などのクライアント側コードによってのみ読み取り可能です。したがって、PHP SDK はhttp://karmakorn.com/karmakorn/alpha20/kk-fb-auth.phpしか認識しないため、キー$_REQUESTが含まれていません。access_token

質問・注意事項

  1. redirect_uri には何を使用していますか? http://apps.facebook.com/your_canvas_url/のようなものを使用したいと思います
  2. parse_signed_request自分自身を呼び出したり、署名付きリクエスト ページからコードをコピーしたりする必要はありません。PHP SDK がそれを行います。ただ電話してください:

    $facebook = new Facebook(array(
        'appId' => '…',
        'secret' => '…',
    ));
    $access_token = $facebook->getAccessToken();
    

可能な解決策

  1. Facebook Javascript SDKも使用してください。<script>リンク先ページ (kk-fb-auth.php) にそのタグを追加することから始めることができます (完全な詳細についてはドキュメントを参照してください; を設定することを忘れないでくださいoauth: true)。JS SDK は Cookie (fbsr_126736467765 という名前) を設定する必要があります。この Cookie は、PHP SDK がそれ以降のページの読み込みを介して$_REQUEST、または読み込み時に読み取ることができます。$_COOKIE
于 2011-09-09T00:10:35.430 に答える
0

これを PHP で行う場合は、redirect_uri で Graph API を個別に呼び出して、ユーザーのアクセス トークンを取得できます。このためには、インデックス ページの $auth_url の response_type を「コード」または「コード トークン」に変更する必要があります。

次に、リダイレクト ページで、Facebook がクエリ文字列に「コード」パラメーターを追加します。この API 呼び出しは、完全な access_token と有効期限を返します。

https://graph.facebook.com/oauth/access_token?
    client_id=YOUR_APP_ID&
    redirect_uri=YOUR_URL&
    client_secret=YOUR_APP_SECRET&
    code=$_REQUEST['code']

詳細については、認証に関するドキュメントを参照してください。

于 2011-09-09T05:10:07.980 に答える