私は次の方法でアプリを認証しています:
// authorize app!
$('#authApp').click(function(){
var oauth_url = 'https://www.facebook.com/dialog/oauth/';
oauth_url += '?client_id=#{app.id}';
oauth_url += '&redirect_uri=' + encodeURIComponent('https://www.facebook.com/pages/null/#{fbPageId()}/?sk=app_#{app.id}');
oauth_url += '&scope=user_likes,user_photos';
oauth_url += '&app_data=7B%27game%27%3A+%27key%27%7D';
oauth_url += '&state=sbSbsbSb';
ご覧のとおり、クエリ文字列の一部として「state」パラメータを設定しています。これで、ユーザーがアプリを承認すると、リダイレクトURLにリダイレクトされます。
ただし、stateパラメーターで渡されたデータはアプリに投稿されず、アプリのiframeクエリ文字列の一部でもありません。署名されたリクエストの一部としてそれを見つけることを期待していましたが、そうではありませんでした。これは、承認後にポストバックされた逆シリアル化された署名付きリクエストです
{ algorithm: 'HMAC-SHA256',
expires: 1348927200,
issued_at: 1348921162,
oauth_token: 'AAA...',
page: { id: '490...', liked: true, admin: false },
user: { country: 'ec', locale: 'en_US', age: { min: 21 } },
user_id: '1...' }
親ページのクエリ文字列に状態が含まれていることはわかります。アプリからそのパラメーターにアクセスする必要があります(iframe内で実行)。同一生成元ポリシーの制限のため、親ページのウィンドウの場所にアクセスすることはできないと思います。
ドキュメントを読み、オンラインで検索しました。アプリの認証全体でデータを永続化するには、stateパラメーターを使用する必要があります。ただし、アプリにリダイレクトされた後、その状態パラメーターを取得する方法についてはどこにも記載されていません。
これは、状態パラメータに関するFacebookドキュメントからのものです。
リクエストとコールバックの間でアプリケーションの状態を維持するために使用される一意の文字列。Facebookがユーザーをredirect_uriにリダイレクトすると、このパラメーターの値が応答に含まれます。クロスサイトリクエストフォージェリから保護するためにこれを使用する必要があります。
親のページクエリ文字列から状態データを取得することになっていますか?それとも私は何か間違ったことをしていますか?
*編集* 状態パラメーターにユーザーからユーザーへのリクエストIDを保存しています。たとえば、AはFacebookリクエストを介してアプリに参加するようにBを招待します。Bがアプリを承認したら、Aに報酬を与える必要があります。だから私はBがAの招待に続いてアプリに来たことを知る必要があります。したがって、requestIdを状態パラメーターに格納します。Bがアプリを承認すると、適切なアクションを実行できます。
*編集2(解決策)** redirect_uriがページタブのURLを指している場合、Facebookは状態パラメーターを送り返しません!CanvasURLにリダイレクトした場合にのみ返送されます!!!!!