iframeキャンバスアプリでは、ユーザーがすでにアプリを承認している場合、signed_requestにはuser_idとoauth_tokenが含まれるため、ユーザーを「承認」ページにリダイレクトする必要はありません。signed_requestに含まれる可能性のあるものの例をいくつか示します。
ユーザーがアプリを承認していません:
signed_request =
{
"algorithm":"HMAC-SHA256",
"issued_at":1299083443,
"user":{"country":"ca","locale":"en_US","age":{"min":21}
}
ユーザーはすでにアプリを承認しています:
signed_request = {
"algorithm":"HMAC-SHA256",
"expires":1299092400,
"issued_at":1299085507,
"oauth_token":access_token,
"user":{"country":"ca","locale":"en_US","age":{"min":21}},
"user_id":user_id
}
user_idとoauth_tokenが表示されない場合は、JavaScriptのwindow.top.location.hrefテクニックを使用できます。user_idとoauth_tokenが表示されている場合は、ユーザーにアプリの認証を依頼する必要はありません。ユーザーはすでに認証を行っているからです。つまり、ユーザーが1月1日にアプリを承認し、1月10日に戻ってきた場合、signed_requestには1月10日の訪問時にuser_idとoauth_tokenが既に含まれています。
これが私が使っているテクニックです。これがお役に立てば幸いです。
以下のBrynJのコメントに応えて、2011年3月7日に更新されました。
signed_requestを取得するには、アプリケーション設定で「OAuth 2.0 forCanvas」が有効になっていることを確認する必要があります(これは、http://www.facebook.comで設定を編集するときに[詳細設定]タブにあります)。 /developers/apps.php)。これはすべての新しいアプリでデフォルトで有効になっていますが、古いアプリがある場合は、自分で有効にする必要があります。また、同じ[詳細設定]タブの[キャンバスにPOST]設定に注意してください。これが有効になっている場合、signed_requestはPOST本文で渡されます(例:signed_request = 12345)。無効になっている場合、signed_requestはクエリ文字列で渡されます。
signed_requestを取得したら、それを検証してデコードし、user_idとoauth_tokenを取得する必要があります。Facebookはここに本当に良い例があります:
http://developers.facebook.com/docs/authentication/signed_request/
ところで、Facebookは3月12日にすべてのiframeアプリをこれに切り替えるため、「POSTforCanvas」を有効にすることをお勧めします。詳細はこちら:http ://developers.facebook.com/docs/canvas/post/