2017-03-08 2 views
2

私はPython /フラスコで書かれたAPIを持っています。私はこのAPIにアクセスするためにいくつかのURLだけを許可したいと思います。 JavaScriptの呼び出しは次のように、些細なjQueryのです:Flask Access-Control-Allow複数のURLの起源

$.ajax({ 
    url: "http://myApi.com/api/doit", 
    dataType:'JSON', 
    success:function(data){ 
     console.log("DEBUG: yeeeeaaaahhh!"); 
    }, 
    error:function(xhr){ 
     console.log("Error occured! status: " + xhr.status + ", text: " + xhr.statusText); 
    } 
    }); 

主にここでのソリューションのほとんどは、常にAccess-Control-Allow-Origin : '*'を設定したり、チェックを無効にクロムを開始するために提供し、かなりがっかりしています。もちろん動作しますが、これは目的ではありません。 w3の仕様では、セミコロンで区切られたリストが機能するはずだが、そうではないという。カンマで区切られたリストも失敗しました。 フラスコ自体からはhttp://flask.pocoo.org/snippets/56/がありますが、複数のURLでは機能しません。コメントには、提案があります:h.extend([("Access-Control-Allow-Origin", orig) for orig in origin])しかし、それでも動作しません。

私が持っている唯一の解決策は、原点をチェックして、白いリストにある場合は、Access-Control-Allow-Origin : '*'というヘッダーに入れることです。これは回避策ですが、あまり好きではありません。より洗練されたソリューションを提案できますか?

答えて

2

これは、同じフロントエンドプロジェクトの複数のインスタンスをローカルFlaskサーバーに同時にアクセスする場合、および資格情報を許可する(つまりJWT認証を使用する)ためにワイルドカード "*"が許可されない場合の典型的なシナリオです。

開発中の私のアプローチは、after_requestデコレータとFlaskのリクエストコンテキストを使用することです。それがある場合は、原点にアクセスを許可するresponse.headersを注入し、参照元がホワイトリストにあるかどうかを確認、今

white = ['http://localhost:8080','http://localhost:9000'] 

すべての着信要求をインターセプトするafter_requestデコレータを使用して:

ドメインのホワイトリストを作成します。 。例:

from flask import request 

@app.after_request 
def add_cors_headers(response): 
    r = request.referrer[:-1] 
    if r in white: 
     response.headers.add('Access-Control-Allow-Origin', r) 
     response.headers.add('Access-Control-Allow-Credentials', 'true') 
     response.headers.add('Access-Control-Allow-Headers', 'Content-Type') 
     response.headers.add('Access-Control-Allow-Headers', 'Cache-Control') 
     response.headers.add('Access-Control-Allow-Headers', 'X-Requested-With') 
     response.headers.add('Access-Control-Allow-Headers', 'Authorization') 
     response.headers.add('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, DELETE') 
    return response 
関連する問題