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