🐍

PyramidでのCORSとPreflight request

2021/11/08に公開

CORSとPreflight request

仕事でCORSとPreflight requestについてハマったので備忘録的に書いておきます

Code

Access-Control-Allow-Origin

例: 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
GitHubで編集を提案

Discussion