2016-03-17 3 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"; 
     } 
    } 
} 

Мой вопрос: Есть ли способ, чтобы вспомнить пароль введённое и позволяет авторизованным пользователям легко ориентироваться ? Или я пропустил что-то тривиальное?

EDIT: В моей Джанго 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» option? – Phillip

ответ

8

Основная аутентификация использует заголовок Authorization для передачи пользователю и паролю. Django REST also uses this header in the TokenAuthentication authentication backend. Nginx does not support multiple Authorization headers, поэтому, если вы попытаетесь войти в систему и одновременно используете аутентификацию Token, все будет ломаться.

Решение не требует никаких изменений в приложение Django будет использовать другое средство аутентификации в Nginx, например, client certificates, или вы можете использовать ngx_http_auth_request_module, чтобы проверить, является ли подписанный куки сессии установить/действителен или если запрос IP находится в (временном) белом списке и перенаправляет пользователя на страницу с формой входа в систему.

+1

^лучший ответ когда-либо, спасли меня довольно часто ЧАСЫ отладки –

Смежные вопросы