hitode909の日記

以前はプログラミング日記でしたが、今は子育て日記です

nginxでBASIC認証とIPアドレスのチェックでsatisfy anyしているときにBASIC認証をオフにしたいときにはIPアドレスのチェックも忘れずオフにする

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