# CORS: поддержка кросс-доменных запросов
CORS (Cross-origin resource sharing) — это технология, которая позволяет выполнять кросс-доменные запросы, то есть веб-приложению из одного домена обращаться к HTTP-ресурсам другого домена. По умолчанию браузеры в целях безопасности ограничивают кросс-доменные запросы, поэтому веб-приложения могут запрашивать ресурсы только с того домена, с которого были загружены.
Начиная с версии ноды 1.4.7, нода по умолчанию передает в HTTP-заголовке Access-control-allow-origin
домен, указанный в запросе в заголовке Origin
. Таким образом, веб-приложениям с любых доменов разрешено делать запросы к REST API вашей ноды.
Если требуется, вы можете изменить настройки CORS. Для этого в файле конфигурации ноды укажите HTTP-заголовки, которые нода будет добавлять в ответ REST API:
access-control-allow-headers
access-control-allow-origin
access-control-allow-methods
access-control-allow-credentials
Пример настроек:
waves {
rest-api {
cors-headers {
access-control-allow-headers = ["Authorization", "Content-Type", "X-Requested-With", "Timestamp", "Signature", "X-API-Key", "api_key"]
access-control-allow-origin = "http://example.org"
access-control-allow-methods = ["OPTIONS", "POST", "GET", "DELETE"]
access-control-allow-credentials = true
}
...
}
...
}
Настройки для более ранних версий
Выполните следующие действия:
- Отключите CORS в настройках ноды.
- Настройте веб-сервер.
- Включите CORS и отправку авторизационных данных в запросе к REST API.
1. Отключите CORS в настройках ноды
В файле конфигурации ноды укажите waves.rest-api.cors = no
.
2. Настройте веб-сервер
Добавьте веб-сервер — например, nginx — который будет работать между веб-сайтом и нодой и добавлять в ответ REST API ноды следующие HTTP заголовки:
Access-control-allow-credentials: true
Access-control-allow-headers: DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,signature,timestamp
Access-control-allow-methods: GET, POST, OPTIONS, PUT, DELETE
Access-control-allow-origin: https://example.com
Access-control-expose-headers: Content-Length,Content-Range
Обратите внимание: в заголовке Access-control-allow-origin
должен быть указан конкретный домен (не *). Если вы хотите, чтобы любые веб-сайты могли использовать REST API вашей ноды, настройте веб-сервер таким образом, чтобы он передавал в этом заголовке домен, указанный в запросе в заголовке Origin
.
Пример настройки nginx:
server {
listen 80;
server_name "";
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log error;
...
location / {
proxy_pass http://wavesrpc ;
...
if ($request_method = 'OPTIONS') {
return 204;
}
set $ref "*";
if ($http_referer ~* ^(http?\:\/\/)(.*?)\/(.*)$) {
set $ref $1$2;
}
add_header 'Access-Control-Allow-Origin' $ref always;
add_header 'Access-Control-Allow-Credentials' 'true' always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE' always;
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,signature,timestamp' always;
add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range' always;
}
...
}
3. Включите CORS и отправку авторизационных данных в запросе к REST API
Пример:
const response = await fetch(url, {
mode: 'cors',
credentials: 'include',
...
body: JSON.stringify(data)
});