🐍
PyramidでのCORSとPreflight request
CORSとPreflight request
仕事でCORSとPreflight requestについてハマったので備忘録的に書いておきます
Code
Access-Control-Allow-Origin
- Responseの中に
Access-Control-Allow-Origin
をつけるとホワイトリスト的にHTTPリクエストを許可できる
例: Pyramidでlocalhostからのアクセスを許可する場合、event.response.headers[["Access-Control-Allow-Origin"]]
にOriginを書く
def add_cors_to_response(event):
response = event.response
response.headers[
"Access-Control-Expose-Headers"
] = "Content-Type,Date,Content-Length,Authorization,X-Request-ID"
response.headers["Access-Control-Allow-Origin"] = "http://localhost"
response.headers["Access-Control-Allow-Credentials"] = "true"
Preflight request
-
Preflight request = 本リクエストの前に送る、Methodが
OPTIONS
なHTTPリクエスト-
単純リクエスト以外の時に送られる
-
<a>, <form>
とかではなく、XMLHttpRequestやFetch APIのようなJSから利用できるもの
-
-
単純リクエスト以外の時に送られる
- この後の本リクエストで
Access-Control-Allow-Headers
ヘッダーに許可されていないものがあるとCORS policyでブロックされる
例: Pyramidで任意のヘッダーを許可する
def add_cors_preflight_handler(config):
config.add_route(
"cors-options-preflight",
"/{catch_all:.*}",
cors_preflight=True,
)
config.add_view(
cors_options_view,
route_name="cors-options-preflight",
permission=NO_PERMISSION_REQUIRED,
)
def cors_options_view(context, request):
response = request.response
if "Access-Control-Request-Headers" in request.headers:
response.headers[
"Access-Control-Allow-Methods"
] = "OPTIONS,HEAD,GET,POST,PUT,DELETE"
response.headers[
"Access-Control-Allow-Headers"
] = "Content-Type,Accept,Accept-Language,Authorization,X-Request-ID" # ここに追加する
return response
Discussion