Nginx密码身份验证会不断提示输入密码

时间:2016-03-17 10:20:40

标签: django authentication nginx uwsgi

我想上传我网站的开发分支,以便我可以向客户展示它,并在尽可能接近生产的环境中进行测试(代码可能还没有为生产做好准备)。因此我想密码保护这个网站。

我正在使用Django开发一个网站并使用nginx来服务该网站(使用uWsgi)。我设法在应用以下指令时提示输入密码:

auth_basic "Restricted Content";  # also tried "Private Property"
auth_basic_user_file /etc/nginx/.htpasswd;

但问题是,在正确输入第一个密码后,它会一直提示我输入用户&密码再次;好像每个API调用都需要进行身份验证。

我认为问题可能出在我的配置文件中,所以这是我的site.conf文件:

server {
    listen 80;
    server_name panel.mysite.dev;
    root /path/to/my/app/front/dist;

    ### I've also tried 'auth_basic' here

    location / {

        root /path/to/my/app/front/dist;
        index index.html;

        auth_basic "Private Property";
        auth_basic_user_file /etc/nginx/.htpasswd;
    }
    location /media {
        rewrite ^(.*)$ http://media.mysite.dev$1;
    }
    location /static {
        rewrite ^(.*)$ http://static.mysite.dev$1;
    }

}

server {
    listen 80;
    server_name api.mysite.dev;

    ### I've also tried 'auth_basic' here

    location /api {
        client_max_body_size 25m;
        uwsgi_pass unix:/tmp/api.mysite.dev.sock;
        include /path/to/my/app/back/uwsgi_params;
    }

}
server {
    listen 80;
    server_name media.mysite.dev;
    root /path/to/my/app/media;
    add_header 'Access-Control-Allow-Origin' '.*\.mysite\.[com|dev]';

    location / {
        root /path/to/my/app/media;
    }
}
server {
    listen 80;
    server_name static.mysite.dev;
    root /path/to/my/app/static;
    if ($http_origin ~* (https?://.*\.mysite\.[com|dev](:[0-9]+)?)) {
        set $cors "true";
    }
    location / {
        if ($cors = "true") {
            add_header 'Access-Control-Allow-Origin' "$http_origin";
        }
    }
}

我的问题:输入后是否有任何方法可以记住密码,并允许经过身份验证的用户轻松导航?或者我错过了一些微不足道的事情?

编辑: 在我的django settings.py

AUTHENTICATION_BACKENDS = (
    'oauth2_provider.backends.OAuth2Backend',
    'django.contrib.auth.backends.ModelBackend',
    'allauth.account.auth_backends.AuthenticationBackend',
)
...
REST_FRAMEWORK = {
    ...
    DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
        'oauth2_provider.ext.rest_framework.OAuth2Authentication',
    ),

非常感谢您提前。任何帮助将不胜感激

1 个答案:

答案 0 :(得分:14)

基本身份验证使用Authorization标头来传输用户和密码。 Django REST also uses this header in the TokenAuthentication authentication backend。 Nginx does not support multiple Authorization headers,所以如果您尝试登录并同时使用令牌身份验证,事情就会中断。

不需要更改Django应用程序的解决方案是在nginx中使用其他身份验证方法,例如client certificates,或者,您可以使用ngx_http_auth_request_module检查签名的会话cookie是否为设置/有效或请求IP是否在(临时)白名单中,并将用户重定向到具有登录表单的页面。