7

Ich habe eine Website nur für den privaten Verbrauch von 3 Codern bestimmt. Es ist einfaches HTML, das von nginx direkt geliefert wird, aber für den Verbrauch innerhalb und außerhalb des Büros gedacht ist.Sehr einfache Authentifizierung mit Einmal-Cookie auf Nginx

Ich möchte ein einfaches Passwort oder Authentifizierungsschema haben. Ich könnte HTTP Auth verwenden, aber diese neigen dazu, ziemlich oft ablaufen, was es ein Schmerz für die Menschen macht zu verwenden. Ich bin auch nervös, es ist viel einfacher für jemanden zu schnuppern als Kekse.

Also frage ich mich, ob ich einfach einen Cookie auf ihren Browsern in JavaScript mit einer eindeutigen langen ID setzen könnte und irgendwie nginx nur Anfragen (für eine bestimmte Subdomain) mit diesem Cookie akzeptieren würde.

Ist das einfach genug zu tun? Wie kann ich

  1. tell nginx zu filtern, indem Cookie
  2. im Browser, wird ein Cookie gesetzt, das nie abläuft?

Antwort

6

Um Nginx Filter durch ein Cookie haben, können Sie eine Aktion durchführen können, wenn das Cookie nicht vorhanden ist, und Ihre Aktion für die 3 Personen dann, die Zugang haben, zum Beispiel:

server { 
    ... 
    if ($http_cookie !~ 'secretvalue') { 
     return 401; 
    } 
    location/{ 
     #Auth'd behaviour 
    } 
} 

und ein Cookie zu setzen, die nie abläuft, das Browser JavaScript-Konsole auf einer Seite Feuer, die auf Ihrem Server des Hostnamen, und geben Sie ein:

document.cookie = 'cookie=secretvalue;max-age=3153600000;path=/'; 

, das für immer technisch nicht ist, b ut 100 Jahre sollten es tun. Sie können auch expires= für ein absolutes Datum im RFC1123-Format verwenden, wenn Sie so geneigt sind und das path bei Bedarf anpassen können.

Es gibt auch Browser-Add-ons, mit denen Sie beliebige Cookies erstellen können, aber alle modernen Browser haben eine JavaScript-Konsole.

+1

Ich glaube, Sie bedeuten ~ –

+0

Guten Fang, @doronaviguy. Die Antwort wurde aktualisiert! – davidjb

1

Es gibt eine wirklich ziemlich einfach aussehende Lösung, die ich von a blog post by Christian Stocker gefunden habe. Es implementiert die folgenden Regeln:

  1. Wenn der Benutzer auf einer internen IP ist, sind sie zulässig.
  2. Wenn der Benutzer einen Cookie gesetzt hat, sind sie erlaubt.
  3. Wenn weder Streichhölzer, wird der Benutzer mit http Standardauthentifizierung präsentiert und , wenn sie erfolgreich eine langfristige Cookie authentifizieren gesetzt

Das ist wirklich das Beste aus beiden Welten.

Hier ist die Konfiguration:

map $cookie_letmein $mysite_hascookie { 
    "someRandomValue" "yes"; 
    default   "no"; 
} 

geo $mysite_geo { 
    192.168.0.0/24 "yes": #some network which should have access 
    10.10.10.0/24 "yes": #some other network which should have access 
    default  "no"; 
} 


map $mysite_hascookie$mysite_geo $mysite_authentication{ 
    "yesyes" "off"; #both cookie and IP are correct => OK 
    "yesno" "off"; #cookie is ok, but IP not => OK 
    "noyes" "off"; #cookie is not ok, but IP is ok => OK 
    default "Your credentials please"; #everythingles => NOT OK 
} 

server { 
    listen 80; 
    server_name mysite.example.org; 
    location/{ 
    auth_basic $mysite_authentication; 
    auth_basic_user_file htpasswd/mysite; 
    add_header Set-Cookie "letmein=someRandomValue;max-age=3153600000;path=/"; #set that special cookie, when everything is ok 
    proxy_pass http://127.0.0.1:8000/; 
    proxy_set_header Host $host; 
    proxy_set_header X-Forwarded-For $remote_addr; 
    } 
}