2012-07-20 15 views
9

Estoy tratando de probar mi aplicación Django localmente usando SSL. Tengo una vista con el decorador @login_required. Entonces, cuando presiono /locker, me redireccionan al /locker/login?next=/locker. Esto funciona bien con http.Django @login_required dejando caer https

Sin embargo, cada vez que use https, la redirección de alguna manera cae la conexión segura, por lo que obtener algo así como https://cumulus.dev/locker -> http://cumulus.dev/locker/login?next=/locker

Si voy directamente a la página se abre https://cumulus.dev/locker/login?next=locker bien por una conexión segura. Pero una vez que ingreso el nombre de usuario y la contraseña, vuelvo al http://cumulus.dev/locker.

Estoy usando Nginx para manejar el SSL, que luego se comunica con runserver. Mi configuración de nginx es

upstream app_server_djangoapp { 
server localhost:8000 fail_timeout=0; 
} 

server { 
listen 80; 
server_name cumulus.dev; 

access_log /var/log/nginx/cumulus-dev-access.log; 
error_log /var/log/nginx/cumulus-dev-error.log info; 

keepalive_timeout 5; 

# path for static files 
root /home/gaurav/www/Cumulus/cumulus_lightbox/static; 

location/{ 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header Host $http_host; 
    proxy_redirect off; 

    if (!-f $request_filename) { 
     proxy_pass http://app_server_djangoapp; 
     break; 
    } 
} 
} 

server { 
listen 443; 
server_name cumulus.dev; 

ssl on; 
ssl_certificate /etc/ssl/cacert-cumulus.pem; 
ssl_certificate_key /etc/ssl/privkey.pem; 

access_log /var/log/nginx/cumulus-dev-access.log; 
error_log /var/log/nginx/cumulus-dev-error.log info; 

keepalive_timeout 5; 

# path for static files 
root /home/gaurav/www/Cumulus/cumulus_lightbox/static; 

location/{ 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header X-Forwarded-Ssl on; 
    proxy_set_header Host $http_host; 
    proxy_redirect off; 

    if (!-f $request_filename) { 
     proxy_pass http://app_server_djangoapp; 
     break; 
    } 
} 
} 
+0

que iba a decir: "Oh, sólo cambia el' LOGIN_URL' en su archivo 'settings.py'" ... pero lo he intentado y no funciona Buena pregunta. –

Respuesta

4

Django se está ejecutando en HTTP plano sólo por detrás del proxy, por lo que siempre va a usar eso para construir URLs absolutas (como redirecciones), a menos que se configure la forma de ver que la solicitud proxy era originalmente hecho a través de HTTPS.

A partir de Django 1.4, puede hacerlo utilizando la configuración SECURE_PROXY_SSL_HEADER. Cuando Django ve el encabezado configurado, tratará la solicitud como HTTPS en lugar de HTTP: request.is_secure() devolverá verdadero, se generarán https:// URL, y así sucesivamente.

Sin embargo, tenga en cuenta las advertencias de seguridad en la documentación: debe asegúrese de que el proxy reemplaza o elimina el encabezado confiable de todas las solicitudes de clientes entrantes, tanto HTTP como HTTPS. Su configuración nginx anterior no hace eso con X-Forwarded-Ssl, por lo que es spoofable.

Una solución convencional para esto es establecer X-Forwarded-Protocol a http o https, según corresponda, en cada una de las configuraciones de su proxy. A continuación, puede configurar Django que buscarlo usando:

SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTOCOL', 'https') 
+0

¡Gracias! :) Lo hice funcionar usando Gunicorn, pero recuerdo configurar los encabezados pero no pude usar la configuración del encabezado porque todavía estoy en 1.3. –

+0

@GauravDadhania ¿recuerdas cómo lo descubriste? Estoy buscando para responder http://stackoverflow.com/questions/29737089/how-do-i-use-a-login-redirect-with-https-in-django – YPCrumble

Cuestiones relacionadas