Angular CORS: PUT отсутствует заголовок авторизации после предварительной проверки OPTIONS - PullRequest
0 голосов
/ 26 декабря 2018

Я хочу отправить данные из Angular на вход HTTP Logstash.Поскольку HTTP-вход Logstash не обрабатывает предварительный запрос CORS изящно ( не может отключить базовую аутентификацию для OPTIONS ), я хочу использовать nginx перед Logstash в качестве прокси.Соответствующая часть моей конфигурации nginx выглядит следующим образом:

location / {
    add_header 'Access-Control-Allow-Origin' *;
    add_header 'Access-Control-Allow-Credentials' true;
    add_header 'Access-Control-Allow-Headers' 'Authorization,DNT,User-Agent,Keep-Alive,Content-Type,accept,origin,X-Requested-With';
    add_header 'Access-Control-Expose-Headers' 'Authorization,DNT,User-Agent,Keep-Alive,Content-Type,accept,origin,X-Requested-With,Content-Disposition';

    return 200;

    limit_except OPTIONS {
        auth_basic "Restricted access zone";
        auth_basic_user_file /etc/nginx/htpasswd;
        proxy_pass http://localhost:31311;  # logstash listens here
    }
}

Это прекрасно работает для разрешения ОПЦИИ.Соответствующий вывод cURL (из функции Chrome «Копировать как cURL»:

> OPTIONS / HTTP/1.1
> Host: MUNGED
> Access-Control-Request-Method: PUT
> Origin: MUNGED
> Accept-Encoding: gzip, deflate, br
> Accept-Language: en-IL,en;q=0.9,he-IL;q=0.8,he;q=0.7,en-US;q=0.6
> User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/71.0.3578.80 Chrome/71.0.3578.80 Safari/537.36
> Accept: */*
> Referer: MUNGED
> Connection: keep-alive
> DNT: 1
> Access-Control-Request-Headers: content-type
> 
{ [5 bytes data]
< HTTP/1.1 200 OK
< Server: nginx/1.14.0 (Ubuntu)
< Date: Tue, 25 Dec 2018 20:13:01 GMT
< Content-Type: application/octet-stream
< Content-Length: 0
< Connection: keep-alive
< Access-Control-Allow-Origin: *
< Access-Control-Allow-Credentials: true
< Access-Control-Allow-Methods: GET,HEAD,OPTIONS,POST,PUT
< Access-Control-Allow-Headers: Authorization,DNT,User-Agent,Keep-Alive,Content-Type,accept,origin,X-Requested-With
< Access-Control-Expose-Headers: Authorization,DNT,User-Agent,Keep-Alive,Content-Type,accept,origin,X-Requested-With,Content-Disposition

(я не уверен, что Access-Control-Expose-Headers необходим, но в любом случае это не работает ...)

Однако по какой-то причине последующее PUT завершается неудачно, поскольку заголовок Authorization не отправляется в запросе. Соответствующий угловой код выглядит примерно так:

const headers = new HttpHeaders();                                                                                                                                                  
headers.set('Authorization', 'basic ' + btoa(environment.eventUsername + ':' + environment.eventPassword));                                                                         
headers.set('Content-Type', 'application/json');                                                                                                                                    
this.httpClient.put(environment.eventTrackingUrl, event, { headers: headers }).subscribe();

Однако заголовки PUT выглядят так(снова используя copy to cURL):

> PUT / HTTP/1.1
> Host: MUNGED
> Origin: MUNGED
> Accept-Encoding: gzip, deflate, br
> Accept-Language: en-IL,en;q=0.9,he-IL;q=0.8,he;q=0.7,en-US;q=0.6
> User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/71.0.3578.80 Chrome/71.0.3578.80 Safari/537.36
> Content-Type: application/json
> Accept: application/json, text/plain, */*
> Referer: MUNGED
> Connection: keep-alive
> DNT: 1
> Content-Length: 144
> 
} [144 bytes data]
* upload completely sent off: 144 out of 144 bytes
{ [5 bytes data]
< HTTP/1.1 401 Unauthorized
< Server: nginx/1.14.0 (Ubuntu)
< Date: Tue, 25 Dec 2018 21:03:34 GMT
< Content-Type: text/html
< Content-Length: 606
< Connection: keep-alive
< WWW-Authenticate: Basic realm="Restricted access zone"

Нет заголовка авторизации ... Это приводит к сбою PUT с 401.

Любые подсказки относительно того, почему Angular или браузер не 'отправка заголовка авторизации?

...