LINUX.ORG.RU

Access-Control-Allow-Origin & auth_basic

 ,


1

1

Есть простой прокси на nginx

server {
    listen       1985;
    server_name  localhost;
        
    location /{       
    
        auth_basic  "private site";
        auth_basic_user_file .htpasswd;                
        
        add_header Access-Control-Allow-Origin *;
    
        proxy_pass   http://127.0.0.1:1984;        
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;            
        
    }
}


Делаю админку, которая управляет сервером по ajax. Т.е. делает с одного домена запросы на другой по API. Что-бы это реализовать я прописал заголовок Access-Control-Allow-Origin * - все хорошо работало, до того как запилил Basic авторизацию. Дело в том, что заголовок Access-Control-Allow-Origin не отсылается nginx, до успешной авторизации, а браузер хром не авторизует(не отправляет пароль) до тех пор, пока не получить этот заголовок. Какой то замкнутый круг. Подскажите как быть.

★★★★

На сервере сделал

add_header Access-Control-Allow-Origin http://domain.com:8080;
add_header Access-Control-Allow-Methods *;
add_header Access-Control-Allow-Headers *;
add_header Access-Control-Expose-Headers *;
add_header Access-Control-Allow-Credentials true;


На клиенте
xhr.withCredentials = true


Теперь нормально, но браузер запрашивает авторизацию(вылазит окно с вводом пароля)
Если прописать на клиенте
headers = {
    "X-Requested-With": XMLHttpRequest,
    "Authorization": "Basic " + btoa(username + ":" + password)
};

То браузер снова ругается, что не послан заголовок
Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource

Как бы заставить чтобы сервер посылал всегда этот Access-Control-Allow-Origin?

Вот сырой запрос
OPTIONS http://2.domain.com:1985/api/v1/ HTTP/1.1
Host: 2.domain.com:1985
Connection: keep-alive
Cache-Control: max-age=0
Access-Control-Request-Method: GET
Origin: http://2.domain.com:8080
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36
Access-Control-Request-Headers: authorization, x-requested-with
Accept: */*
Referer: http://2.domain.com:8080/
Accept-Encoding: gzip, deflate, sdch
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4


Ответ
HTTP/1.1 401 Unauthorized
Server: nginx/1.11.4
Date: Fri, 16 Sep 2016 12:53:23 GMT
Content-Type: text/html
Content-Length: 597
Connection: keep-alive
WWW-Authenticate: Basic realm="private site"


И ошибка в браузере
XMLHttpRequest cannot load http://2.domain.com:1985/api/v1/. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://2.domain.com:8080' is therefore not allowed access. The response had HTTP status code 401.

gobot ★★★★
() автор топика

А вы знаете толк в извращениях. Правильным решением здесь будет изменить схему, а не пытаться обойти стандарты.

WARNING ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.