CORS
Настройка CORS в приложении.
Введение
CORS (Cross Origin Resource Sharing) — это процесс проверки, который выполняют браузеры, чтобы определить, могут ли они использовать ресурсы, предоставляемые другим адресом.
Он реализуется, когда:
- При разработке фронтенд-слоя с сервером webpack, например при разработке веб-интерфейсов (сайта или веб-приложения) с использованием современных технологий, таких как ReactJS и VueJS.
- Адрес фронтенда отличается от адреса сервисов, например, когда сервисы работают по адресу
http://localhost:9000, а фронтенд — по адресуhttp://localhost:3000. - В продакшене, например, сервисы работают в собственном поддомене
api.example.com, а фронтенд — вwww.example.com.
Подробнее о CORS:
Netuno готов обеспечить интеграцию CORS просто и сразу.
Настройка
Настройка CORS выполняется в файле конфигурации приложения в зависимости от окружения.
Для этого в разрабатываемом приложении перейдите к файлу конфигурации окружения. В этом примере мы будем использовать файл окружения разработки, расположенный по пути:
- 📂
config/_development.json
Проверьте, нет ли уже настроек CORS; если их нет, добавьте в конец файла конфигурации (в формате JSON) параметры конфигурации:
{
...
"cors": [
{
"enabled": true,
"origins": [ "http://localhost:3000", "http://127.0.0.1:3000" ]
}
]
...
}
Конфигурация CORS представляет собой массив и поддерживает несколько различных правил CORS.
Источники
В параметре origins указывается список адресов фронтенда, который будет интегрирован с сервисами.
Продакшен
В продакшене нужно указать в качестве источников адреса, по которым фронтенд будет работать онлайн.
Файл конфигурации приложения, в котором задаётся cors, должен отличаться в зависимости от окружения.
Файлом конфигурации приложения должен быть:
- 📂
config/_production.json
Пример конфигурации CORS:
{
...
"cors": [
{
"enabled": true,
"origins": [ "https://moy-proekt.com", "https://www.moy-proekt.com" ]
}
]
...
}
Файл конфигурации приложения — это _production.json в соответствии с настройкой окружения Netuno, которая находится в файле netuno/config.js:
config.env = 'production'
Заголовок (HTTP-заголовок)
Стандартный заголовок (HTTP-заголовок):
Access-Control-Allow-Origin: http://localhost:3000
Access-Control-Allow-Methods: GET,PUT,POST,DELETE,OPTIONS
Access-Control-Allow-Headers: DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization
Access-Control-Allow-Expose-Headers: Content-Length,Content-Range
Access-Control-Allow-Credentials: true
Чтобы настроить стандартный заголовок, добавьте параметр конфигурации header, например:
{
...
"cors": [
{
"enabled": true,
"header": {
"Access-Control-Allow-Headers": "Authorization"
},
"origins": [ "http://localhost:3000", "http://127.0.0.1:3000" ]
}
]
...
}
В приведённом выше примере в заголовке будет приниматься только Authorization вместо всех остальных, определённых по умолчанию.
Можно добавлять новые определения в заголовок, а также заменять стандартное определение.
Вручную
CORS также можно настроить вручную вместо использования автоматического механизма Netuno.
В вашем приложении Netuno достаточно изменить файл:
📂 server/core/_request_url.js
И использовать следующий код:
const httpHeaderOrigin = _header.getString("Origin", "null")
if (httpHeaderOrigin == 'https://www.moya-app.com'
|| httpHeaderOrigin == 'http://localhost'
|| httpHeaderOrigin == 'http://localhost:3000') {
_header.response.set("Access-Control-Allow-Origin", httpHeaderOrigin)
_header.response.set("Access-Control-Allow-Methods", "GET,PUT,POST,DELETE,OPTIONS")
_header.response.set("Access-Control-Allow-Headers", "content-type,x-requested-with,authorization")
_header.response.set("Access-Control-Allow-Credentials", true)
}
Обратите внимание, что в приведённом выше коде if ограничивает «заголовки» в соответствии с адресом источника (Origin).
Не забудьте изменить на адреса, которые будете использовать.
Таким образом, все сервисы и адреса вашего приложения начнут поддерживать заголовки CORS.
Только для изолированных сервисов
Если вы хотите повысить уровень безопасности, включив заголовки только для конкретных сервисов, используйте ту же логику кода в файле:
📂 server/core/_service_config.js
Вместо файла:
📂 server/core/_request_url.js
Заключение
Когда CORS настроен, Netuno автоматически отвечает стандартным заголовком (HTTP-заголовком) для адресов, настроенных в origins.
Стандартные headers можно настраивать и изменять.
Можно настроить несколько правил CORS.
Хотя Netuno поддерживает ручную настройку правил CORS программным способом, предпочтительнее использовать автоматический механизм, встроенный в конфигурацию приложения.