Django的@login_required下降HTTPS(Django @login_requir

2019-07-30 12:35发布

我想在本地测试我的Django应用程序使用SSL。 我与一个视图@login_required装饰。 所以,当我打/locker ,我重定向到/locker/login?next=/locker 。 这工作得很好则是http。

但是,每当我使用HTTPS,重定向莫名其妙地下降了安全连接,所以我得到的东西像https://cumulus.dev/locker -> http://cumulus.dev/locker/login?next=/locker

如果我直接去https://cumulus.dev/locker/login?next=locker页面打开通过安全连接罚款。 但是,一旦我输入用户名和密码,我回去http://cumulus.dev/locker

我使用Nginx的处理SSL,然后会谈到runserver 。 我的nginx的配置是

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

Answer 1:

Django是在普通HTTP仅次于代理运行,因此它总是用它来构建绝对URL(如重定向),除非你将其配置如何看到代理请求最初取得了HTTPS。

由于Django的1.4,你可以用做SECURE_PROXY_SSL_HEADER设置。 当Django看到配置报头,它将当作HTTPS而不是HTTP请求: request.is_secure()就返回true, https://的URL将被生成,等等。

但是,请注意文档中的安全警告:你必须确保代理代替或剥离所有传入的客户端请求的信任头部,HTTP和HTTPS。 你的nginx的配置上面并没有做到这一点与X-Forwarded-Ssl ,使得它具有欺骗性。

传统的解决方案是设置X-Forwarded-Protocolhttphttps ,酌情在每个代理配置。 然后,您可以配置的Django看它使用:

SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTOCOL', 'https')


文章来源: Django @login_required dropping https