nginxで、BASIC認証を知ってる場合か、IPアドレスで許可されてる場合はBASIC認証なしで閲覧できる、というのをやりたいとき、satisfy anyを使う。
satisfy anyの例としてこんなのがあって、
http {
satisfy any;
allow 192.168.1.0/32;
deny all;
auth_basic "closed site";
auth_basic_user_file conf/htpasswd;
}
ところで、一部のlocationだけBASIC認証をオフにしたいこともある。
外部連携しているサービスからのコールバックを受けたくて、アプリケーション側で認証しているときなど。
そのときに、以下のようにauth_basic off;
だけ書いても、上のsatisfy anyで設定したIPアドレスのチェックは残ってしまうので、IPアドレスが合致しない場合には絶対に閲覧できないlocationになってしまう。
http {
satisfy any;
allow 192.168.1.0/32;
deny all;
auth_basic "closed site";
auth_basic_user_file conf/htpasswd;
server {
location /public/ {
auth_basic off;
}
}
}
全世界に公開したいときには、IPアドレスでのチェックも外す、ということを明示する必要があった。
http {
satisfy any;
allow 192.168.1.0/32;
deny all;
auth_basic "closed site";
auth_basic_user_file conf/htpasswd;
server {
location /public/ {
auth_basic off;
allow all;
}
}
}
図にするとあたりまえだと思うけど、普通はBASIC認証をオフにすると公開範囲が広がる、というイメージが強くて(図の右側)、allow all;
も必要なことにしばらく気づかなかった。
普通の論理的な思考という感じで、ドキュメントを呼んでも手がかりはなくて、しばらく考えたら分かった。難しかったのでメモしておく。
認証方法を複数用意しているのは難しいので、BASIC認証は廃止して、なんらかのユーザープールに所属していたら見えるとか、VPNにつないでたら見れる、とか、そういう統一されたシンプルな形にしていきたいものだと思う。