2017-02-02 11 views
1

モバイルデバイスとWebブラウザの両方に応答するAPIを作成しました。たとえば、Webの場合は/web/toys、JSONの場合は/API/toysとなります。私はJWトークンを認証手段として使用しています。
私はフォームをHTML形式で表示しています。バックグラウンドでフォームを表示しています.jQueryのAjaxのメソッドを呼び出して、APIにPOSTします。私はセッションクッキーにaccess_tokensを保持しています。 CSRFの攻撃を防ぐため、Flask-JWT-Extendedを使用しています。
Flask JWT拡張セットCookieエラー

@jwt_requiredのビューを装飾し、CSRFがTrueに設定されている場合、クッキーが設定されて転送されている場合でもmissing JWT in headers and cookiesと表示されます。ソースコードを確認したところ、要求ヘッダーにX-CSRF-TOKENを設定することが重要であることが判明しました。
しかし、エンドポイントはGET呼び出しとPOST呼び出しの両方に応答するので、jQueryを使用して完全なページをロードせずに、GET呼び出しでヘッダーを設定するにはどうすればよいですか?
基本的には、Webページにフォームを表示したいと思います。ユーザーがsubmitをクリックすると、フォームはjQueryを使用して既存のAPIに転送されます。
物事を処理するより良い方法があれば、私はそれを知りたいです。
ありがとうございます!

+0

あなたのhtmlフォームのコードを投稿することができますか? – lapinkoira

答えて

0

Flask-JWTの著者 - ここに拡張。あなたが発見したように、この拡張機能では、現在、あらゆる種類のリクエストに対してCSRF保護を行っています。ただし、CSRFの保護は、状態変更要求でのみ必要です。https://security.stackexchange.com/questions/115794/should-i-use-csrf-protection-for-get-requests/115800

すべての要求タイプを保護する利点は、エンドポイントがGET要求で状態を誤って変更した場合です(技術的な理由はありませんでした)それはCSRFの攻撃に対して脆弱になります。今、バックエンドがより仕様通りに設計されている場合、これはもはや問題ではありません。 Flask-JWT-Extendedを更新して、Flask-WTFの動作と同様に、特定のタイプの要求に対するCSRF保護を無視できるようにする必要があるようです。私は今日これを更新しようとします。

代わりに、バックエンドがhtmlの代わりにJSON(REST APIバックエンドやjavascriptフロントエンドなど)を直接提供している場合、Ajaxを使用してCSRFトークンでGETリクエストを行うことができます。この使用例では、これらの行に沿ってAjax呼び出しを使用できます。

get (options) { 
    let self = this 
    $.ajax({ 
     method: 'GET', 
     dataType: 'json', 
     headers: { 
     'X-CSRF-TOKEN': Cookies.get('csrf_access_token') 
     }, 
     url: "some_url", 
     success (result, statusText) { 
     // Handle success 
     }, 
     error (jqXHR, textStatus, errorThrown) { 
     //handle error 
     } 
    }) 
    } 

編集:私はまた、CSRFトークンが存在しない場合はCSRFのエラーメッセージを維持したいとあなたがJWTsのために両方のヘッダとクッキーを使用しています。これらの両方の進捗状況は、ここで追跡することができます:

+0

この機能はバージョン1.3.0でリリースされました。デフォルトでは、PUT、PATCH、POST、およびDELETE要求に対するCSRF保護のみがチェックされます。このリストを更新するには、 'JWT_CSRF_METHODS'設定オプションを使用します。 – vimalloc

+0

ありがとうございました!私はFlaskのMethodViewを使用して、ポスト定義にデコレータを適用できますか? –

+0

私の本質は、実際のビュー機能自体にデコレータを適用する必要があるということです。つまり、複数のメソッド(method = ['GET'、 'POST'])を受け入れるビュー関数があれば、jwt_requiredデコレータを安全に追加することができ、POSTリクエストでCSRFをチェックするだけですその視点に – vimalloc

関連する問題