Я хочу отправить данные из 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 или браузер не 'отправка заголовка авторизации?