Часто при вызове API вы можете увидеть ошибку в вашей консоли, которая выглядит так:
Access to fetch at 'http://somesite.com' from origin 'http://yoursite.com' has been blocked by CORS policy: The 'Access-Control-Allow-Origin' header has a value that is not equal to the supplied origin
В этом посте мы собираемся узнать, почему эта ошибка происходит и как вы можете это исправить.
Что такое заголовок доступа-элемента управления?
Access-Control-Allow-light это заголовок CORS. CORS, или обмен ресурсами CROSS Origin, является механизмом для браузеров, чтобы позволить сайту работать по происхождению A, чтобы запросить ресурсы из происхождения B.
Происхождение – это не просто имя хоста, но комбинация порта, имени хоста и схемы, например – http://mysite.example.com:8080/
Вот пример того, где это входит в действие –
- У меня есть происхождение A:
http://mysite.com.И я хочу получить ресурсы из происхождения B:http://yoursite.comОтказ - Чтобы защитить вашу безопасность, браузер не позволит мне доступа к ресурсам с yousite.com и заблокирует мой запрос.
- Чтобы позволить началу Acount A для доступа к вашим ресурсам, ваше происхождение B нужно будет позволить браузеру знать, что для меня все в порядке, чтобы получить ресурсы из вашего происхождения.
Вот пример из сети Developer Mozilla, которая действительно объясняет это действительно хорошо:
С помощью CORS браузеры позволяют истоками делиться ресурсами между собой.
Есть Немногие заголовки которые позволяют обменять ресурсы по всему происхождению, но главный это Access-Control-Allow-light Отказ Это говорит о браузере, какое происхождение разрешено получать запросы с этого сервера.
Кому нужно установить доступа-контроль-разрешение –
Чтобы понять, кому нужно установить этот заголовок, рассмотрите этот сценарий: вы просматриваете веб-сайт, который используется для просмотра и прослушивания песен. Веб-сайт пытается сделать соединение с баком на фоне злонамеренно.
Таким образом, у кого есть окончательная способность предотвратить этот вредоносный сайт воровать ваши данные из банка? Банк! Итак, банк должен будет защитить его ресурсы, установив Access-Control-Allow-light заголовок как часть ответа.
Просто помните: происхождение, ответственное за обслуживание ресурсов, нужно будет установить этот заголовок.
Как использовать и когда пройти этот заголовок
Вот пример значений, которые вы можете установить:
Access-Control-Allow-Origin: *: Позволяет любому происхождению.Доступ-контроль-разрешение: http://mysite.com: Разрешить запросы только от mysite.com.
Увидеть это в действии
Давайте посмотрим на пример. Вы можете проверить этот код На моем Github Repo Отказ
Мы собираемся построить сервер по происхождению A http://localhost: 8000 который отправит строку Привет с API конечная точка. Мы собираемся позвонить с этой конечной точкой, создавая клиента по происхождению B http://localhost: 3000 а затем используйте fetch, чтобы запросить ресурс. Мы ожидаем увидеть строку Привет пропущено по происхождению A в консоли браузера происхождения B.
Скажем, у нас есть происхождение http://localhost: 8000 Это служит на этот ресурс на /API конечная точка. Сервер отправляет ответ с заголовком Access-Control-Allow-light Отказ
const express = require("express");
const app = express();
const port = process.env.SERVER_PORT || 8000;
// Add Access Control Allow Origin headers
app.use((req, res, next) => {
res.setHeader("Access-Control-Allow-Origin", "https://yoursite.com");
res.header(
"Access-Control-Allow-Headers",
"Origin, X-Requested-With, Content-Type, Accept"
);
next();
});
app.get("/api", (req, res) => {
res.json("Hello");
});
app.listen(port, () => console.log(`Listening on port ${port}`));
На стороне клиента вы можете назвать эту конечную точку, позвонив принести нравится:
fetch('http://localhost:8000/api')
.then(res => res.json())
.then(res => console.log(res));
Теперь откройте консоль вашего браузера, чтобы увидеть результат. Поскольку заголовок в настоящее время установлен, чтобы разрешить доступ только от https://yoursite.com , браузер заблокирует доступ к ресурсу, и вы увидите ошибку в вашей консоли.
Теперь, чтобы исправить это, измените заголовки к этому:
res.setHeader("Access-Control-Allow-Origin", "*");
Проверьте консоль вашего браузера, и теперь вы сможете увидеть строку Привет Отказ
Заинтересованы в большем количестве учебных пособий и JSBYTES от меня? Подпишитесь на мою рассылку.
Оригинал: “https://www.freecodecamp.org/news/access-control-allow-origin-header-explained/”