7

Tengo un sitio destinado solo para el consumo privado por 3 codificadores. Es simple HTML servido por nginx directamente, pero destinado para el consumo dentro y fuera de la oficina.Autenticación muy simple usando una cookie única en nginx

Quiero tener una contraseña simple o un esquema de autenticación. Podría usar HTTP auth, pero estos tienden a caducar con bastante frecuencia, lo que hace que sea difícil para las personas usarlo. También estoy nervioso porque es mucho más fácil que alguien huela que las galletas.

Así que me pregunto si podría simplemente configurar una cookie en sus navegadores en JavaScript con una identificación larga única y de alguna manera decirle a nginx que solo acepte solicitudes (para un subdominio particular) que tenga esta cookie.

¿Es esto lo suficientemente simple de hacer? ¿Cómo puedo

  1. tell nginx para filtrar por galletas
  2. en el navegador, establecer una cookie que nunca caduca?

Respuesta

6

Tener filtro de Nginx por una galleta, usted podría realizar alguna acción si la cookie no es presente, y entonces su acción real para las 3 personas que tienen acceso, por ejemplo:

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

y para establecer una cookie que nunca expira, el fuego de la consola JavaScript de su navegador en una página que está en el nombre de host de su servidor, y escriba:

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

que técnicamente no es para siempre, b por 100 años debería hacerlo. También puede usar expires= para una fecha absoluta en formato RFC1123 si así lo desea y puede ajustar fácilmente el path si lo necesita.

También hay complementos del navegador que le permitirán crear cookies arbitrarias, pero todos los navegadores modernos tienen una consola de JavaScript.

+1

creo que quería decir ~ –

+0

Buena captura, @doronaviguy. Actualizado la respuesta! – davidjb

1

Hay una solución de búsqueda realmente bastante simple que encontré en a blog post by Christian Stocker. Implementa las siguientes reglas:

  1. Si el usuario tiene una IP interna, están permitidos.
  2. Si el usuario tiene un conjunto de cookies, están permitidos.
  3. Si ninguno de los partidos, se presenta al usuario con la autenticación básica HTTP, y si se autentica correctamente una cookie a largo plazo se establece

Esto es realmente lo mejor de ambos mundos.

Aquí está el config:!

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