Facebookリクエストの署名要求を満たすために、jQueryで$ .getJSONのコールバックとして名前付き関数を使用する
-
03-07-2019 - |
質問
jQueryを介してFacebook API Admin.getMetricsメソッドにアクセスしようとしています。サーバー側でリクエストURLを正しく作成しています(アプリのシークレットを保持するため)。次に、 jQuery.getJSON()
を使用して、リクエストするブラウザーにURLを送信します。
Facebookでは、信頼性を検証するために、アプリケーションシークレットでハッシュされたすべての要求パラメーターのコピーを要求と共に送信する必要があります。問題は、jQueryはコールバック関数自体の名前を生成して、データが返されたときに呼び出される匿名関数に渡す名前と一致させることです。したがって、 jQuery.getJSON()
が実行され、署名が一致しないためにリクエストが不正であるとFacebookが判断するまで、関数の名前は使用できません(送信する署名には正しいコールバックパラメーターが含まれていませんそれは jQuery.getJSON()
が実行されるまで生成されなかったためです。
この問題から考えられる唯一の方法は、匿名のままにするのではなく、何らかの方法で jQuery.getJSON()
に関数の名前を指定することです。しかし、jQuery APにはそのためのオプションが見つかりません。
解決 2
jQuery.getScript
の使用は、答えに近いものの、完全ではないことが判明しました。 getScriptを使用すると、jQueryが動的に名前が付けられた匿名関数を要求パラメーターに追加する必要がなくなります(ただし、上記のコードのように匿名関数を渡すと、引き続き実行されます)。ただし、jQueryのAjaxライブラリの他のすべての呼び出しと同様に、 jQuery.getScript
のデフォルトは、追加の引数 _ = 12344567
(1234567は実際にはタイムスタンプ)。 jQueryはこれを実行して、ブラウザーが応答をキャッシュしないようにします。ただし、この追加により、自動名前付きコールバック関数と同様に、要求の署名が解除されます。
#jqueryのいくつかの助けを借りて、jQueryをパラメーターでまったく混乱させない唯一の方法は、次の引数を指定したベース jQuery.Ajax
メソッドを使用してリクエストを行うことであることを学びました:
jQuery.ajax({
url: fbookUrl,
dataType: "script",
type: "GET",
cache: true,
callback: null,
data: null
});
( fbookUrl
は、署名と callback = myFunction
を含む完全なパラメーターで要求しようとしているFacebook APIのURLです)。 dataType:" script"
argは、結果のJSONPを実行のためにページ上のスクリプトタグに詰める必要があることを指定します。 cache:true
は、jQueryにブラウザが応答をキャッシュします。つまり、タイムスタンプパラメータの追加をスキップします。
他のヒント
仕事をしてくれたのは次の設定だけでした
jQuery.ajax({
url:fbookUrl、
dataType:" jsonp&quot ;,
タイプ:" GET&quot ;,
キャッシュ:true、
jsonp:false、
jsonpCallback:" MyFunctionName" //ここに関数名を挿入します
});
JSONPオプションを$ .ajaxSetupに渡すと、呼び出される関数名を修正できます。ドキュメントは次のようになります。
jsonp文字列
jsonpリクエストのコールバック関数名をオーバーライドします。この値は、「callback =?」で「callback」の代わりに使用されますGETのURLまたはPOSTのデータのクエリ文字列の一部。したがって、{jsonp: 'onJsonPLoad'}は 'onJsonPLoad =?'になります。サーバーに渡されます。
これは、固定のコールバックを使用したより優れたソリューションです。
window.fixed_callback = function(data){
alert(data.title);
};
$(function() {
$.getScript("http://api.flickr.com/services/feeds/photos_public.gne?tags=cats&tagmode=any&format=json&jsoncallback=fixed_callback", function(data) {
alert('done'); } );
});
このコールバックの問題は、関数がグローバルに登録されるため、一度に1種類のリクエストしか処理できないことです。コールバック関数は、適切な関数を取得して呼び出すことができるさまざまな種類のデータのディスパッチャに変更する必要があるでしょう。