Az API hívásakor gyakran előfordulhat, hogy a konzolon egy ilyen hibát lát:
Access to fetch at '//somesite.com' from origin '//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
Ebben a bejegyzésben megtudjuk, miért történik ez a hiba, és hogyan lehet kijavítani.
Mi a Access-Control-Allow-Origin
fejléc?
Access-Control-Allow-Origin
egy CORS fejléc. A CORS vagy a Cross Origin Resource Sharing egy olyan mechanizmus, amely lehetővé teszi a böngészők számára, hogy az A származási helynél futó webhelyek engedélyezzék az erőforrások bekérését a B származásból.
Az eredet nemcsak a hosztnév, hanem a port, a hosztnév és a séma kombinációja, például - //mysite.example.com:8080/
Itt van egy példa arra, hogy ez hol lép működésbe -
- Van egy származás:
//mysite.com
és azt szeretné, hogy forrásokat eredetű B//yoursite.com
. - Az Ön biztonsága érdekében a böngésző nem engedi, hogy hozzáférjek a yoursite.com forrásaihoz, és blokkolja a kérésemet.
- Annak érdekében, hogy az A származás hozzáférhessen az erőforrásaihoz, a B származásnak tudatában kell adnia a böngészőnek, hogy rendben van, ha forrásokat szerzek az Ön származási helyéből.
Itt van egy példa a Mozilla Developer Network-től, amely ezt nagyon jól megmagyarázza:

A CORS segítségével a böngészők lehetővé teszik az origók számára, hogy erőforrásokat osszanak meg egymás között.
Van néhány fejléc, amely lehetővé teszi az erőforrások megosztását az eredet között, de a fő az Access-Control-Allow-Origin
. Ez megmondja a böngészőnek, hogy milyen eredetűek lehetnek a kérések fogadása erről a szerverről.
Kinek kell beállítania Access-Control-Allow-Origin
?
Annak megértéséhez, kinek kell beállítania ezt a fejlécet, vegye figyelembe ezt a forgatókönyvet: Olyan webhelyet böngész, amelyet dalok megtekintésére és meghallgatására használnak. A weboldal megpróbálja rosszindulatúan kapcsolatot létesíteni a háttérben lévő bankjával.
Tehát kinek van végső képessége megakadályozni, hogy ez a rosszindulatú webhely ellopja az adatait a banktól? A bank! Tehát a banknak meg kell védenie forrásait a Access-Control-Allow-Origin
fejléc beállításával a válasz részeként.
Ne feledje: az erőforrások kiszolgálásáért felelős származásnak be kell állítania ezt a fejlécet.
Hogyan kell használni és mikor kell továbbadni ezt a fejlécet
Íme egy példa a beállítható értékekre:
Access-Control-Allow-Origin : *
: Bármely eredetet engedélyez.Access-Control-Allow-Origin : //mysite.com
: Csak a mysite.com webhelyről érkező kéréseket engedélyezheti.
Lásd működés közben
Nézzünk meg egy példát. Ezt a kódot megnézheti a GitHub repo-n.
Felépítünk egy szervert az A eredetre, //localhost:8000
amely Hello
s karakterláncot küld egy api
végpontnak. Ezzel a végponttal fogunk hívni egy kliens létrehozásával a B eredeten //localhost:3000
, majd a Fetch használatával kérni az erőforrást. Várhatóan látni fogjuk Hello
az A eredet által átadott karakterláncot a B származási böngésző konzolján.
Tegyük fel, //localhost:8000
hogy van egy eredetünk , amely ezt az erőforrást szolgálja a /api
végponton. A szerver választ küld a fejléccel Access-Control-Allow-Origin
.
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", "//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}`));
Az ügyfél oldalon ezt a végpontot az alábbiak szerint hívhatja meg fetch
:
fetch('//localhost:8000/api') .then(res => res.json()) .then(res => console.log(res));
Most nyissa meg a böngésző konzolját az eredmény megtekintéséhez.
Mivel a fejléc jelenleg úgy van beállítva, hogy csak innen engedélyezze a hozzáférést //yoursite.com
, a böngésző blokkolja az erőforráshoz való hozzáférést, és hibát fog látni a konzolján.

Ennek kijavításához módosítsa a fejléceket erre:
res.setHeader("Access-Control-Allow-Origin", "*");
Ellenőrizze a böngésző konzolját, és most láthatja a karakterláncot Hello
.