[[oktatas:web:angular|< Angular]] ====== Angular CORS ====== * **Szerző:** Sallai András * Copyright (c) 2025, Sallai András * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC Attribution-Share Alike 4.0 International]] * Web: https://szit.hu ===== A CORS ===== A CORS beállítások a megvédenek minket a Cross-Site Request Forgery (CSRF) támadások ellen és segítheti a Cross-Site Scripting (XSS) támadások elleni védekezést is. ===== A probléma fejlesztéskor ===== Fejlesztési időben általában külön szerveren futtatjuk a Backend-t és a Frontend-t. * Backend például: localhost:8000 * Frontend például: localhost:4200 A CORS ezt nem engedi meg. A probléma a böngésző biztonsági politikája miatt van. Alapértelmezetten a böngésző nem engedi meg az ilyen keresztkéréseket. ===== Megoldás szerveroldalon ===== A szerver oldalon, vagyis a Backend programban engedélyezhetjük a megfelelő CORS fejléc előállítását, ami megengedi a 4200 portól érkező kéréséket. A böngésző ha azt látja a szervertől kapott válasz fejlécében, hogy a engedélyezett például a localhost:4200 címre kérés, akkor el fogja fogadni. De ezt a Backend-nek kell megmondania. Hogyan kell ezt beállítani, Backend-től függ. ExpressJS Backend szerver például alapértelmezetten nem enged semmilyen keresztkérést. De a cors csomag használatával már mindent megenged: import cors from 'cors' //... app.use(cors()) Ha biztonsági okokból szabályozni szeretnénk, hogy honnan állítható, akkor paraméterezzük a cors() függvényt. const corsOptions = { origin: 'http://localhost:4200', } app.use(cors(corsOptions)) ===== Megoldás fejlesztési időben Angularban ===== Ez a megoldás csak fejlesztési időben működik. Ha a CORS probléma a kész terméknél is fennáll, azt szerveren oldalon kell beállítani! Ha nem áll módunkban Backend oldalon beállítani a CORS-t, akkor fejlesztési időben Angularban létrehozhatunk egy proxy működést. Készítsünk az **src** könyvtárban egy **proxy.conf.json** nevű fájlt: { "/api": { "target": "http://localhost:8000", "changeOrigin": true, "secure": false } } A "/api" rész azért került a beállításba, mert feltételezzük, hogy a végpontok ez alatt érhetők el. Egy employees végpont például így: * /api/employees A target értéke a Backend elérése. Állítsuk be az Angular konfigurációban ennek a fájlnak a használatát. Szerkesszük az **angular.json** fájlt. "architect": { "serve": { "builder": "@angular-devkit/build-angular:dev-server", "options": { "proxyConfig": "src/proxy.conf.json" }, ... }, ... } Indítsuk újra az Angular fejlesztői szervert. Az Angular fejlesztői szervert minden esetben újra kell indítani, ha változtattunk a **angular.json** tartalmán. A szolgáltatásainkban ezek után a localhost:8000 helyett a localhost:4200-t írjuk. Például egy szolgáltatásban a getEmployees() metódus a dolgozók adatait akarja lekérni az URL így néz ki: getEmployees() { let url = 'http://localhost:4200/api/employees'; return this.http.get(url); } Vegyük észre, hogy REST API kérést, most az Angular szerver 4200-s portjára küldjük. A kérést először az Angular fejlesztői szervere dolgozza fel, ami a böngészőnek meg fog felelni. A kérést viszont tovább dobja a Backend szerverre. ===== Lásd még ===== * https://v17.angular.io/guide/build#proxying-to-a-backend-server (Angular 17 esetén: 2025) * https://angular.dev/tools/cli/serve (Angular később változat esetén: 2025)