Atsakymas į prašymą prieš skrydį neatitinka prieigos kontrolės patikrinimo

Klaida naudojant „ngResource“, kad galėčiau naudoti „Amazon“ REST API „Amazon“ žiniatinklio paslaugoms:

XMLHttpRequest negali atsisiųsti http://server.apiurl.com:8000/s/login?login=facebook . Atsakymas į prašymą prieš skrydį neatitinka prieigos kontrolės patikrinimo. Nėra „Access-Control-Allow-Origin“ antraštės prašomame šaltinyje. Todėl „ http: // localhost “ kilmė neleidžiama. Klaida 405

Paslauga:

 socialMarkt.factory('loginService', ['$resource', function($resource){ var apiAddress = "http://server.apiurl.com:8000/s/login/"; return $resource(apiAddress, { login:"facebook", access_token: "@access_token" ,facebook_id: "@facebook_id" }, { getUser: {method:'POST'} }); }]); 

valdiklis:

 [...] loginService.getUser(JSON.stringify(fbObj)), function(data){ console.log(data); }, function(result) { console.error('Error', result.status); } [...] 

Naudoju „Chrome“, ir nežinau, ką dar reikia padaryti, kad išspręstumėte šią problemą. Aš netgi nustatiau serverį, kad gautumėte antraštes iš „ localhost .

285
24 февр. nustatė Andre Mendes vasario 24 d 2016-02-24 00:37 '16 at 0:37 2016-02-24 00:37
@ 20 atsakymų

Su CORS susiduriate su problemomis.

Yra keletas būdų, kaip tai išspręsti.

  1. Išjunkite CORS. Pavyzdžiui: kaip išjungti chorų choras
  2. Naudokite naršyklės papildinį
  3. Naudokite tarpinį serverį, pvz., „Nginx“. pavyzdys, kaip konfigūruoti

Išsamiau, bandote pasiekti api.serverurl.com iš vietinio kompiuterio. Tai tiksli kryžminio domeno užklausos apibrėžtis.

Išjunkite jį tik norėdami atlikti savo darbą (gerai, jei jūs einate į kitas svetaines ir įdėjote blogą gynybą, jei lankotės kitose svetainėse), galite naudoti tarpinį serverį, kuris leidžia jūsų naršyklei manyti, kad visi prašymai pateikiami iš vietos prieglobos, kai iš tikrųjų turite vietinį serverį, kuris paskambina į nuotolinį serverį.

todėl „api.serverurl.com“ gali tapti „localhost“: 8000 / api, o vietinis „nginx“ ar kitas tarpinis serveris išsiųs į teisingą paskirties vietą.


Dabar, populiarus paklausa, 100% daugiau informacijos apie CORS .... tas pats puikus skonis!


Ir „downvoters“ ... apeinant CORS, būtent tai yra rodoma tiems, kurie tiesiog mokosi sąsajos. https://codecraft.tv/courses/angular/http/http-with-promises/

163
24 февр. Atsakymas pateiktas E. Maggini 24 vasario mėn. 2016-02-24 00:45 '16 ne 0:45 2016-02-24 00:45

Mano „API serveris“ yra „PHP“ programa, todėl norint išspręsti šią problemą, radau sprendimą toliau:

Padėkite eilutes į index.php

 header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE, OPTIONS'); header('Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token'); 
125
06 апр. Atsakymą Slipstream pateikė 06 Bal 2016-04-06 12:08 '16 at 12:08 2016-04-06 12:08

AspNetCore žiniatinklio api programoje ši problema nustatoma pridedant „Microsoft.AspNetCore.Cors“ (versija 1.1.1) ir pridėkite žemiau pakeitimus „Startup.cs“.

 public void ConfigureServices(IServiceCollection services) { services.AddCors(options => { options.AddPolicy("AllowAllHeaders", builder => { builder.AllowAnyOrigin() .AllowAnyHeader() .AllowAnyMethod(); }); }); . . . } 

ir

 public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { // Shows UseCors with named policy. app.UseCors("AllowAllHeaders"); . . . } 

ir įjungti valdiklį [EnableCors("AllowAllHeaders")] .

35
05 мая '17 в 18:49 2017-05-05 18:49 Atsakymą davė Rajkumar Peter gegužės 05 d. 17, 18:49

„JavaScript“ XMLHttpRequest ir „ Fetch“ laikosi tos pačios kilmės politikos. Taigi, žiniatinklio programa, naudojanti XMLHttpRequest arba Fetch, galėjo tik HTTP užklausas pateikti į savo domeną.

Šaltinis: https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS

Turite siųsti „ Access-Control-Allow-Origin“ HTTP antraštę : * savo daliai.

Jei naudojate „Apache“ kaip HTTP serverį, galite jį pridėti prie „Apache“ konfigūracijos failo taip:

 <IfModule mod_headers.c> Header set Access-Control-Allow-Origin "*" </IfModule> 

Mod_headers yra įjungtas pagal nutylėjimą „Apache“, tačiau galite įsitikinti, kad jis įgalintas paleidžiant:

  a2enmod headers 
14
30 марта '17 в 10:06 2017-03-30 10:06 atsakymą pateikė JedatKinports kovo 30 d. 17 d. 10:06 2017-03-30 10:06

Jei rašote chromo plėtinį

Turite pridėti prie domeno (-ų) manifest.json leidimus.

 "permissions": [ "http://example.com/*", "https://example.com/*" ] 
7
21 июня '17 в 10:59 2017-06-21 10:59 atsakymą pateikė freedev birželio 21, 17, 10:59 2017-06-06 10:59

Jei netyčia naudojate IIS serverį. Galite nustatyti toliau pateikiamas antraštes HTTP užklausos antraštėse.

 Access-Control-Allow-Origin:* Access-Control-Allow-Methods: 'HEAD, GET, POST, PUT, PATCH, DELETE' Access-Control-Allow-Headers: 'Origin, Content-Type, X-Auth-Token'; 

su šiuo visu pranešimu, gaukite ir pan. bus gerai.

5
08 сент. atsakymą pateikė Sunil Kumar 08 sep. 2017-09-08 23:19 '17, 11:19 pm 2017-09-08 23:19

„Python“ vėliavų serveryje galite naudoti „plugin“ žymes, kad išspręstumėte domenų užklausas.

Žr. Https://flask-cors.readthedocs.io/en/latest/

4
25 авг. atsakymą pateikė Teriblus 25 rug . 2016-08-25 15:19 '16 at 15:19 2016-08-25 15:19

PHP galite pridėti antraštes:

 <?php header ("Access-Control-Allow-Origin: *"); header ("Access-Control-Expose-Headers: Content-Length, X-JSON"); header ("Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE, OPTIONS"); header ("Access-Control-Allow-Headers: *"); ... 
3
21 дек. Atsakymas pateikiamas atiruz 21 d. 2017-12-21 17:33 '17 17:33 2017-12-21 17:33

Yra keletas įspėjimų, kai kalbama apie CORS. Pirma, ji neleidžia naudoti pakaitos * bet nepalik manęs, perskaičiau ją kažkur, ir dabar negaliu rasti šio straipsnio.

Jei pateikiate užklausas iš kito domeno, turite pridėti leidžiamų šaltinių antraštes. Access-Control-Allow-Origin: www.other.com

Jei pateikiate užklausas, kurios turi įtakos serverio ištekliams, pvz., POST / PUT / PATCH, ir jei mime tipas skiriasi nuo toliau pateiktos application/x-www-form-urlencoded , multipart/form-data arba text/plain naršyklės, automatiškai pateikite užklausą skrydžio parinktis tikrinti su serveriu, jei tai leidžia.

Taigi, jūsų API / serveris turėtų tvarkyti šiuos OPTIONS prašymus, todėl reikia atsakyti su atitinkamomis access control headers o HTTP atsako būsenos kodas turėtų būti 200 .

Antraštės turėtų būti maždaug tokios pačios, kad jas būtų galima pritaikyti pagal jūsų poreikius: „ Access-Control-Allow-Methods: GET, POST, PUT, PATCH, POST, DELETE, OPTIONS Access-Control-Allow-Headers: Content-Type Access-Control-Max-Age: 86400 Didžiausio amžiaus antraštė yra svarbi, mano atveju tai neveiks be jo, manau, kad naršyklėje reikia informacijos apie „prieigos teisių“ galiojimo laiką.

Be to, jei, pvz., POST užklausą, naudodamiesi application/json mime iš kito domeno, taip pat turite pridėti anksčiau minėtą leidimo šaltinio antraštę, kad jis atrodytų taip:

Access-Control-Allow-Origin: www.other.com Access-Control-Allow-Methods: GET, POST, PUT, PATCH, POST, DELETE, OPTIONS Access-Control-Allow-Headers: Content-Type Access-Control-Max-Age: 86400

Sėkmingai ir gavus visą reikiamą informaciją prieš skrydį, jūsų faktinis prašymas bus pateiktas.

Apskritai, bet kuri „ Access-Control antraštė yra paprašyta prašant pradinio ar prieš skrydį, turi būti nurodyta atsakyme į darbą.

MDN dokumentai turi gerą pavyzdį šioje nuorodoje , taip pat turėtumėte patikrinti šį pranešimą SO

3
22 окт. Atsakymą Sasa Blagojevic pateikė spalio 22 d. 2018-10-22 22:45 '18, 10:45 pm 2018-10-22 22:45

Jie naudoja „ Lambda Integrated Proxy“ su „API Gateway“ . Jūs turite sukonfigūruoti savo lambda funkciją, nes jei siunčiate užklausas tiesiogiai, tai yra, funkcija turi teisingai konfigūruoti atsakymo antraštes. (Jei naudojatės pasirinktomis lambda funkcijomis, tai tvarkys API sąsaja.)

 //In your lambda index.handler(): exports.handler = (event, context, callback) => { //on success: callback(null, { statusCode: 200, headers: { "Access-Control-Allow-Origin" : "*" } } } 
2
08 дек. Atsakymą pateikė Xu Chen 08 gruodis 2017-12-08 03:43 '17 at 3:43 2017-12-08 03:43

„Apache VirtualHost“ konfigūracijos faile pridėjau šias eilutes:

 Header always set Access-Control-Allow-Origin "*" Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT" Header always set Access-Control-Max-Age "1000" Header always set Access-Control-Allow-Headers "x-requested-with, Content-Type, origin, authorization, accept, client-security-token" RewriteEngine On RewriteCond %{REQUEST_METHOD} OPTIONS RewriteRule ^(.*)$ $1 [R=200,L] 
2
11 янв. atsakymas duotas hugsbrugs Jan 11 2017-01-11 15:00 '17 15:00 2017-01-11 15:00

Jei norite pašalinti kryžminių šaltinių užklausas „Node JS“ programoje:

 npm i cors 

Ir tiesiog pridėkite žemiau app.js eilutes app.js

 let cors = require('cors') app.use(cors()) 
1
12 окт. atsakymas suteiktas rohit parte 12 oct. 2018-10-12 18:06 '18, 18:06 2018-10-12 18:06

Aš naudoju AWS SDK atsisiųsti, kai praleidau tam tikrą laiką ieškant interneto, aš atėjau per šią temą. dėka @lsimoneau 45581857, paaiškėja, kad tas pats vyksta. Aš tiesiog atkreipiau dėmesį į mano prašymo regionui URL, pridedant regiono parametrą ir jis veikė.

  const s3 = new AWS.S3({ accessKeyId: config.awsAccessKeyID, secretAccessKey: config.awsSecretAccessKey, region: 'eu-west-2' // add region here }); 
1
07 сент. atsakymas pateikiamas davyCode 07 sep . 2018-09-07 14:18 '18, 14:18 pm 2018-09-07 14:18

Pasirinkti „ GeoServer“ paskirstymai apima „Jetty“ programos serverį. Įgalinti išteklių bendrinimą (CORS), kad „JavaScript“ programos būtų naudojamos ne jūsų domene, kad galėtumėte naudoti „GeoServer“.

Pašalinkite <filter> ir <filter-mapping> iš „webapps / geoserver / WEB-INF / web.xml“:

 <web-app> <filter> <filter-name>cross-origin</filter-name> <filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class> </filter> <filter-mapping> <filter-name>cross-origin</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app> 
1
04 янв. Yassine Ech-Charafi atsakymas yra 04 sausis 2018-01-04 18:07 '18, 18:07 pm 2018-01-04 18:07

Labai dažnai šią klaidą gali sukelti priimančiosios API, atitinkanti užklausą su http metodu (pvz., PUT), ir API klientas API vadina kitą http metodą (pvz., POST arba GET)

1
29 сент. Atsakymą davė Christian Nwafor 29 sep . 2018-09-29 15:40 '18, 15:40 pm 2018-09-29 15:40

Mūsų komanda kartais mato tai naudodama „Vue“, „Axios“ ir „C # WebApi“. Įtraukus maršruto atributą į galutinį tašką, kurį bandote pasiekti, ji pataisoma.

 [Route("ControllerName/Endpoint")] [HttpOptions, HttpPost] public IHttpActionResult Endpoint() { } 
1
20 дек. Atsakymas pateiktas w00ngy . 2018-12-20 23:33 '18, 11:33 pm 2018-12-20 23:33

Su šia problema susidūriau, kai DNS serveris buvo nustatytas kaip 8.8.8.8 (google). Iš tiesų problema buvo maršrutizatoriuje, mano programa bandė prisijungti prie serverio per „Google“, o ne vietoje (mano konkrečiam atvejui). Ištrinau 8.8.8.8, ir tai išsprendė problemą. Žinau, kad šios problemos išsprendžiamos naudojant CORS nustatymus, tačiau galbūt kas nors turės tą pačią problemą kaip ir aš.

1
15 дек. Atsakymą Kirill Gusyatin pateikė gruodžio 15 d. 2016-12-15 16:13 '16 16:13 2016-12-15 16:13

Manau, kad CORS išjungimas iš „Chrome“ nėra labai geras būdas , nes jei jį naudosite jonų režimu, problema mobiliojo ryšio sistemoje vėl padidės.

Taigi geriau nustatyti savo backend.

Visų pirma, antraštės antraštėje turite nustatyti

  • antraštė („Access-Control-Allow-Origin: *“);
  • header („Antraštės rinkinys„ Access-Control-Allow-Headers “:„ Origin “,„ X-Requested With With “, turinio tipas,„ Accept “),);

Ir jei API veikia kaip GET ir POST, tada antraštėje nustatykite „Set“

jei ($ _SERVER ['REQUEST_METHOD'] == 'OPTIONS') {if (isset ($ _ SERVER ['HTTP_ACCESS_CONTROL_REQUEST_METHOD'])) antraštė („Access-Control-Allow-Methods: GET, POST, OPTIONS“);

Kiti klausimai apie „ žymes arba Užduoti klausimą