Shop mit BasicAuth unter nginx absichern, jedoch Zugriff auf RestAPI ermöglichen

Folgendes Problem habe ich:

Ich möchte gerne den gesamten Shop (läuft unter dem Webserver nginx), per BasicAuth absichern (da erst noch in Entwicklung), gleichzeitig möchte ich aber die RestAPI “offen” lassen, da diese ja eine eigene BasicAuth vornimmt. Leider gelingt mir das nicht.

Meine aktuelle config sieht so aus (eingekürzt auf das wesentliche):

server {
    satisfy any;

    # allow from specific ip
    allow 80.153.238.199;

    deny all;

    auth_basic "Protected";
    auth_basic_user_file /etc/nginx/.htpasswd;

    location /api/ {
        satisfy all;
        allow all;
        auth_basic off;
        location ~ \.php$ {
            try_files $uri $uri/ @php;
        }
    }
}

 

Zwar ist der Shop entsprechend protected, allerdings kriege ich von der API nur einen 404 zurück wenn ich /api/version versuche aufzurufen (anstatt dem erwarteten BasicAuth Dialog von der RestAPI.

 

Was übersehe ich? Wo ist mein Denkfehler?

Bin über jede Hilfe/Tipp sehr dankbar.

Falls noch jemand über dieses Problem stösst. Eigentlich ist es ganz “einfach” aber dennoch trivial.

Problem ist bei nginx dass die “deny all” schon greift, bevor “allow all” im location block analysiert wird. Grundsätzlich ist der obige Ansatz korrekt und funktional.

Verbesserung: Man kann mittels einer map zielgerichteter steuern ob eine auth_basic nötig ist und spart sich dann das “off” im zweiten Block.

Die “deny all” Regel sollte dann in einen bzw. die anderen Location Blocks eingefügt werden, dann greift die auch nur, wenn nicht die /api/ angesprochen wird.

Hier die config exemplarisch zusammen gestellt:

http {

  map $host$request_uri $auth_type {
      default "off";

      ~*(internal|test|whatever).mydomain.com/api/* "off";

      ~*(internal|test|whatever).mydomain.com* "Restricted!";
  }

  server {

    satisfy any;

    # allow from specific ip
    allow 80.153.238.199;

    auth_basic $auth_type;
    auth_basic_user_file /etc/nginx/.htpasswd;

    location /api/ {
        satisfy all;
        allow all;
        auth_basic off;
        location ~ \.php$ {
            try_files $uri $uri/ @php;
        }
    }

    # alle anderen locations blocks
    location / {
        deny all;
        ...
    }

  }

}