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につないでたら見れる、とか、そういう統一されたシンプルな形にしていきたいものだと思う。