Access-Control-Allow-Origin "*" не допускается, если флаг учетных данных имеет значение true

У меня есть запрос AJAX, который подключается к http://example.com:6001,

Тем не менее, он будет работать только когда я открою http://example.com:6001 в браузере, который загружает index.html (который запускается через Node.js через порт 6001). Это работает нормально, и AJAX возвращает:

XHR завершил загрузку: http://example.com:6001/_api/

Однако, когда я открываю index.html с моего сервера Apache на:80, вызов ajax вернет:

XMLHttpRequest не может загрузить http://example.com/_api/?xxx. Подстановочный знак "*" не может использоваться в заголовке "Access-Control-Allow-Origin", если флаг учетных данных имеет значение true. Происхождение " http://example.com/", следовательно, не допускается.

Я не уверен, что эта ошибка возвращается CouchDB или Apache.

Я пробовал несколько вариантов следующего в /etc/apache2/sites-available/000-default.conf Apache:

<VirtualHost *:6001>
        Header set Access-Control-Allow-Origin *
        Header set Access-Control-Allow-Credentials "false"
</VirtualHost>

И в /etc/couchdb/local.ini Couch DB (из документации по обмену ресурсами между источниками):

[httpd]
enable_cors = true

[cors]
origins = *
credentials = false

Последнее имеет смысл, потому что, кажется, указывает на credentials флаг..

Это также не должен быть сценарий, потому что он работает в одном и том же "домене порта" (то есть:6001).

2 ответа

Эта ошибка возвращается вашим браузером.

В основном означает, что вы просто не можете этого сделать.

Заголовки, связанные с CORS, не должны быть установлены в Apache (в вашем случае)

Создайте это в своем приложении NodeJS с указанным доменом: порт, а не подстановочный знак.

Вот похожий случай, вы можете посмотреть

Я не знаю NodeJS. В PHP вы можете использовать

header("Access-Control-Allow-Origin: ".$_SERVER['HTTP_ORIGIN']);

смоделировать подстановочный знак.

Пункт 6.1.3 "Простой запрос источника, фактический запрос и перенаправления" не позволяет серверу ресурсов отвечать разрешением с подстановочными знаками, когда ресурс ожидает учетные данные.

http://www.w3.org/TR/cors/

Я предполагаю, что это защищает от разработчиков, слепо выставляющих ресурсы, защищенные учетными данными, любому возможному клиенту, включая те, которые могут работать на простом http-сайте. Ответ на URL-адрес источника запроса в Access-Control-Allow-Origin, по-видимому, указывает на достаточную осведомленность разработчиков о том, что секреты могут распространяться по всему миру.

$ curl -v https://www.googleapis.com/urlshortener/v1/url -X OPTIONS -H "Origin: http://foo" -H "Access-Control-Request-Method: GET"
* Hostname was NOT found in DNS cache
*   Trying 216.58.216.170...
* Connected to www.googleapis.com (216.58.216.170) port 443 (#0)
* successfully set certificate verify locations:
*   CAfile: none
  CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS handshake, Server key exchange (12):
* SSLv3, TLS handshake, Server finished (14):
* SSLv3, TLS handshake, Client key exchange (16):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256
* Server certificate:
*    subject: C=US; ST=California; L=Mountain View; O=Google Inc; CN=*.storage.googleapis.com
*    start date: 2015-04-08 14:12:01 GMT
*    expire date: 2015-07-07 00:00:00 GMT
*    subjectAltName: www.googleapis.com matched
*    issuer: C=US; O=Google Inc; CN=Google Internet Authority G2
*    SSL certificate verify ok.
> OPTIONS /urlshortener/v1/url HTTP/1.1
> User-Agent: curl/7.38.0
> Host: www.googleapis.com
> Accept: */*
> Origin: http://foo
> Access-Control-Request-Method: GET
> 
< HTTP/1.1 200 OK
< Cache-Control: no-cache, no-store, max-age=0, must-revalidate
< Pragma: no-cache
< Expires: Fri, 01 Jan 1990 00:00:00 GMT
< Date: Thu, 16 Apr 2015 03:56:29 GMT
< Access-Control-Allow-Credentials: true
< Access-Control-Allow-Methods: DELETE,GET,HEAD,PATCH,POST,PUT
< Access-Control-Allow-Origin: http://foo
< Access-Control-Max-Age: 3600
< Vary: Origin
< Vary: X-Origin
< Content-Type: application/octet-stream
< X-Content-Type-Options: nosniff
< X-Frame-Options: SAMEORIGIN
< X-XSS-Protection: 1; mode=block
< Content-Length: 0
* Server GSE is not blacklisted
< Server: GSE
< Alternate-Protocol: 443:quic,p=0.5
< 
* Connection #0 to host www.googleapis.com left intact
Другие вопросы по тегам