7

Ho un sito destinato esclusivamente al consumo privato da 3 codificatori. È un semplice HTML gestito direttamente da nginx ma destinato al consumo all'interno e all'esterno dell'ufficio.Autenticazione molto semplice con cookie monouso su nginx

Desidero avere una password semplice o uno schema di autenticazione. Potrei usare l'autenticazione HTTP, ma questi tendono a scadere abbastanza spesso, il che lo rende un dolore per le persone. Sono anche nervoso, è molto più facile per qualcuno annusare rispetto ai cookie.

Quindi mi chiedo se potrei semplicemente impostare un cookie sui loro browser in JavaScript con un ID lungo unico e in qualche modo dire a nginx di accettare solo le richieste (per un particolare sottodominio) che ha questo cookie.

È abbastanza semplice da fare? Come faccio a

  1. tell nginx per filtrare per biscotto
  2. nel browser, impostare un cookie che non scade mai?

risposta

6

Per avere filtro Nginx da un cookie, è possibile eseguire alcune azioni se il cookie non è presente, e allora la vostra vera azione per i 3 persone che hanno accesso, ad esempio:

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

e per impostare un cookie che non scade mai, avviare console JavaScript del browser su una pagina che è sul nome host del server, e inserire:

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

Questo non è tecnicamente sempre, b 100 anni dovrebbero farlo. È inoltre possibile utilizzare expires= per una data assoluta nel formato RFC1123 se si è così inclini e si può facilmente regolare lo path se necessario.

Esistono anche componenti aggiuntivi del browser che consentono di creare cookie arbitrari, ma tutti i browser moderni dispongono di una console JavaScript.

+1

penso che si intende ~ –

+0

Buona cattura, @doronaviguy. Aggiornamento della risposta! – davidjb

1

C'è una soluzione molto semplice che ho trovato da a blog post by Christian Stocker. Implementa le seguenti regole:

  1. Se l'utente è su un IP interno, è consentito.
  2. Se l'utente ha un set di cookie, è consentito.
  3. Se né le partite, l'utente è presentato con http autenticazione di base, e se l'autenticazione con successo un cookie a lungo termine è impostato

Questo è davvero il meglio dei due mondi.

Ecco la configurazione:

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; 
    } 
}