CORS奮闘記
概要
Basic認証が有効になっているHTTPサーバーに対するCORSは注意が必要
Basic認証が有効になっているHTTPサーバーに対するCORSの流れ
- CORS先のサーバーがBasic認証を有効にしていると、Authorizationヘッダーが含まれるxhrを送るまえに、ブラウザがOPTIONSリクエストを送るプリフライト(Preflight)という動作が入る
- したがって、面倒くさがらずにプリフライトに対するレスポンス用の設定をきちんと設定する必要がある。さもないとハマる
- CORS先のサーバーからプリフライトのレスポンスをする
- この時、レスポンスヘッダ
Allow-Control-Headersにワイルドカードだけでなく、明示的にAuthorizationヘッダも許可しないとブラウザからのxhrにBasic認証を使ってくれずハマる
- この時、レスポンスヘッダ
- CORSのためのxhrをブラウザが送る
上記を踏まえたnginxの設定
Settings for Streamlit Static
map $http_origin $cors_header {
default "";
"http://localhost:8000" $http_origin; #デバッグ用。本格運用したら削除したほうが良いかも
"https://moonshot.labs.basisconsulting.co.jp" $http_origin;
}
server {
location /app/static {
alias /home/ubuntu/moonshot-geoplatform/moonshot-data/static;
add_header Access-Control-Allow-Origin $cors_header;
auth_basic "MOONSHOT";
auth_basic_user_file /etc/nginx/.htpasswd-moonshot;
# preflight対応 (ハマりポイントその1)
if ($request_method = 'OPTIONS') {
add_header Access-Control-Allow-Origin $cors_header;
add_header Access-Control-Allow-Methods 'GET, POST, PUT, DELETE, OPTIONS';
add_header Access-Control-Allow-Credentials: 'true'; #CORSで認証を使うことを許可(ハマりポイントその2)
add_header Access-Control-Allow-Headers 'Authorization, *'; #CORSで認証を使うことを許可(ハマりポイントその2)
add_header Access-Control-Max-Age 300;
add_header Content-Type 'text/plain charset=UTF-8';
add_header Content-Length 0;
return 204;
}
}
}