2016-03-17 189 views
2

我想上传我的网站的开发分支,以便我可以将其展示给客户,并在尽可能接近生产的环境中进行测试(使用可能无法准备生产的代码)。因此我想密码保护这个网站。Nginx密码身份验证不断提示输入密码

我正在开发一个使用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

您的Django网站有没有机会使用HTTP身份验证,但使用不同的用户名和密码? (我问你是否写过“API调用”; Django REST框架确实支持[基本认证](http://www.django-rest-framework.org/api-guide/authentication/#basicauthentication))。 – Phillip

+0

我不这么认为,但我不确定。我接受'TokenAuthentication'和'OAuth2Authentication'(我编辑了添加认证相关设置的问题以防万一)。是对的吗?或者我可以限制所有来自我的django配置的请求(不仅是那些需要身份验证的请求(我使用Django Rest Framework处理的请求),但是所有请求都考虑到我不希望该站点被暴露? – vabada

+2

然后这就是你的冲突:基本的HTTP认证和TokenAuthentication都使用Authorization标头,如果他们看到另一个标头(从他们的角度来看,它是无效的),两者都会抱怨。是否SessionAuthentication是选项? – Phillip

回答

8

基本认证使用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位于(临时)白名单中,否则将用户重定向到具有登录表单的页面。

+1

^有史以来最好的答案,拯救我prolly小时的调试 –

相关问题