it-swarm.asia

الرد على طلب الاختبار المبدئي لا يجتاز فحص التحكم في الوصول

أتلقى هذا الخطأ باستخدام ngResource للاتصال بـ REST API في Amazon Web Services:

يتعذر على XMLHttpRequest تحميل http://server.apiurl.com:8000/s/login؟login=facebook . الرد على طلب الاختبار المبدئي لا يجتاز فحص التحكم في الوصول: لا يوجد رأس "وصول - تحكم - السماح - أصل" موجود على المورد المطلوب. الأصل ' http: // localhost ' لذلك لا يسمح بالوصول. خطأ 405

الخدمات:

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'}
            });
}]);

مراقب:

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

أنا أستخدم Chrome ، ولا أعرف ماذا أفعل لإصلاح هذه المشكلة. لقد قمت حتى بتكوين الخادم لقبول الرؤوس من Origin localhost.

319
Andre Mendes

أنت تعمل في قضايا CORS.

هناك عدة طرق لإصلاح/حل المشكلة.

  1. قم بإيقاف تشغيل CORS. على سبيل المثال: كيفية إيقاف تشغيل cors في chrome
  2. استخدم مكونًا إضافيًا لمتصفحك
  3. استخدام وكيل مثل nginx. مثال على كيفية إعداد

بشكل أكثر شفهية ، أنت تحاول الوصول إلى api.serverurl.com من المضيف المحلي. هذا هو التعريف الدقيق لطلب النطاق المتقاطع.

إما بإيقاف تشغيله فقط لإنجاز عملك (حسنًا ، ضع أمانًا ضعيفًا لك إذا قمت بزيارة مواقع أخرى وركلت العلبة فقط) ، يمكنك استخدام وكيل يجعل متصفحك يعتقد أن جميع الطلبات تأتي من المضيف المحلي عندما حقًا لديك خادم محلي يقوم باستدعاء الخادم البعيد.

لذلك قد يصبح api.serverurl.com مضيفًا محليًا: 8000/api وسيرسل nginx المحلي أو الوكيل الآخر إلى الوجهة الصحيحة.


الآن حسب الطلب الشعبي ، 100 ٪ أكثر من معلومات CORS .... نفس الذوق العظيم!


وبالنسبة للمتخلفين عن التصويت .... تجاوز CORS هو بالضبط ما يظهر لأولئك الذين يتعلمون ببساطة الواجهة الأمامية. https://codecraft.tv/courses/angular/http/http-with-promises/

186
E. Maggini

"خادم API" الخاص بي هو PHPتطبيق _ لحل هذه المشكلة ، وجدت الحل التالي يعمل:

ضع السطور في 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');
135
Slipstream

في AspNetCore web api ، تم إصلاح هذه المشكلة عن طريق إضافة "Microsoft.AspNetCore.Cors" (ver 1.1.1) وإضافة التغييرات أدناه على Startup.cs.

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

و

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{


    // Shows UseCors with named policy.
    app.UseCors("AllowAllHeaders");
    .
    .
    .
}

ووضع [EnableCors("AllowAllHeaders")] على وحدة التحكم.

37
Rajkumar Peter

جافا سكريبت XMLHttpRequest و الجلب اتبع سياسة الأصل نفسه. لذلك ، يمكن لتطبيق ويب يستخدم XMLHttpRequest أو Fetch فقط تقديم طلبات HTTP إلى المجال الخاص به.

المصدر: https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS

يجب عليك إرسال Access-Control-Allow-Origin: * رأس HTTP من جانب الخادم الخاص بك.

إذا كنت تستخدم Apache كخادم HTTP الخاص بك ، فيمكنك إضافته إلى ملف تكوين Apache كما يلي:

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

يتم تمكين Mod_headers افتراضيًا في Apache ، ومع ذلك ، قد ترغب في التأكد من تمكينه عن طريق تشغيل:

 a2enmod headers
14
Tadej

إذا كنت تكتب chrome-extension

يجب عليك إضافة manifest.json في أذونات المجال الخاص بك.

"permissions": [
   "http://example.com/*",
   "https://example.com/*"
]
8
freedev

هناك بعض المحاذير عندما يتعلق الأمر بـ CORS. أولاً ، لا يسمح باستخدام أحرف البدل * ، لكن لا تمسكني بهذا السؤال الذي قرأته في مكان ما ولا يمكنني العثور على المقالة الآن.

إذا كنت تقدم طلبات من مجال مختلف ، فأنت بحاجة إلى إضافة رؤوس السماح لـ Origin. Access-Control-Allow-Origin: www.other.com

إذا كنت تقدم طلبات تؤثر على موارد الخادم مثل POST/PUT/PATCH ، وإذا كان نوع mime مختلفًا عن application/x-www-form-urlencoded أو multipart/form-data أو text/plain التالية ، فسيقوم المتصفح تلقائيًا بطلب OPTIONS قبل الرحلة للتحقق من الخادم. سوف تسمح بذلك.

لذلك ، يحتاج خادم/واجهة برمجة التطبيقات الخاصة بك إلى معالجة طلبات OPTIONS وفقًا لذلك ، تحتاج إلى الرد برمز access control headers المناسب ويجب أن يكون رمز حالة استجابة http 200.

يجب أن تكون الرؤوس شيء من هذا القبيل ، وضبطها حسب احتياجاتك: Access-Control-Allow-Methods: GET, POST, PUT, PATCH, POST, DELETE, OPTIONS Access-Control-Allow-Headers: Content-Type Access-Control-Max-Age: 86400 رأس الحد الأقصى للعمر مهم ، في حالتي ، لن يعمل بدونه ، أعتقد أن المتصفح يحتاج إلى معلومات عن المدة التي تستغرقها "حقوق الوصول" صالحة.

بالإضافة إلى ذلك ، إذا كنت تفعل مثل طلب POST مع application/json mime من مجال مختلف ، تحتاج أيضًا إلى إضافة عنوان Origin Origin المسموح به مسبقًا ، لذلك سيبدو كما يلي:

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

عندما تنجح الرحلة قبل الحصول على جميع المعلومات المطلوبة ، سيتم تقديم طلبك الفعلي.

بشكل عام ، يجب تقديم أي استجابة لرؤوس Access-Control في الطلب الأولي أو قبل الرحلة ، حتى تعمل.

يوجد مثال جيد في مستندات MDN هنا على هذا الرابط ، ويجب عليك أيضًا التحقق من هذا SO post

6
Sasa Blagojevic

إذا كنت تستخدم خادم IIS بالصدفة. يمكنك تعيين الرؤوس أدناه في خيار رؤوس طلب HTTP.

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

مع هذا كل وظيفة ، والحصول على الخ ، سوف تعمل بشكل جيد.

5
Sunil Kumar

في PHP يمكنك إضافة الرؤوس:

<?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: *");
...
4
atiruz

بالنسبة لخادم python flask ، يمكنك استخدام البرنامج المساعد flask-cors لتمكين طلبات النطاق المتقاطع.

راجع: https://flask-cors.readthedocs.io/ar/latest/

4
Teriblus

لإصلاح مشكلات الطلبات المشتركة في تطبيق Node JS:

npm i cors

وببساطة أضف الأسطر أدناه إلى app.js

let cors = require('cors')
app.use(cors())
3
Rohit Parte

في ملف التكوين Apache VirtualHost ، أضفت الأسطر التالية:

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
hugsbrugs

قد يكون السبب الشائع لهذا الخطأ هو أن واجهة برمجة تطبيقات المضيف قد عيّنت الطلب إلى طريقة http (على سبيل المثال PUT) وأن عميل واجهة برمجة التطبيقات يتصل بـ API باستخدام طريقة http مختلفة (مثل POST أو GET)

2
Christian Nwafor

يرى فريقنا هذا من حين لآخر باستخدام Vue ، axios و C # Web Api. إضافة سمة مسار في نقطة النهاية التي تحاول الوصول إليها تعمل على إصلاحها لنا.

[Route("ControllerName/Endpoint")]
[HttpOptions, HttpPost]
public IHttpActionResult Endpoint() { }
2
w00ngy

بالنسبة لأولئك الذين يستخدمون Lambda Integrated Proxy مع API Gateway . تحتاج إلى تكوين وظيفة lambda الخاصة بك كما لو كنت تقوم بتقديم طلباتك إليها مباشرةً ، مما يعني أن الوظيفة يجب أن تقوم بإعداد رؤوس الاستجابة بشكل صحيح. (إذا كنت تستخدم وظائف lambda المخصصة ، فستتم معالجتها بواسطة بوابة API).

//In your lambda's index.handler():
exports.handler = (event, context, callback) => {
     //on success:
     callback(null, {
           statusCode: 200,
           headers: {
                "Access-Control-Allow-Origin" : "*"
           }
     }
}
2
Xu Chen

لقد واجهت هذه المشكلة عندما تم تعيين خادم DNS على 8.8.8.8 (جوجل). في الواقع ، كانت المشكلة في جهاز التوجيه ، حاول تطبيقي الاتصال بالخادم عبر google ، وليس محليًا (لحالتي الخاصة). لقد أزلت 8.8.8.8 وهذا حل المشكلة. أعلم أن هذه المشكلات تم حلها عن طريق إعدادات CORS ، لكن ربما سيواجه شخص ما نفس المشكلة التي تواجهني

1
Kirill Gusyatin

أنا أستخدم AWS sdk للتحميلات ، بعد قضاء بعض الوقت في البحث على الإنترنت ، عثرت على هذا الموضوع. بفضلSimoneau 45581857 اتضح أن نفس الشيء كان يحدث بالضبط. لقد أشرت ببساطة إلى طلبي Url للمنطقة على دلو لي من خلال إرفاق خيار المنطقة وعملت.

 const s3 = new AWS.S3({
 accessKeyId: config.awsAccessKeyID,
 secretAccessKey: config.awsSecretAccessKey,
 region: 'eu-west-2'  // add region here });
1
davyCode

تتضمن التوزيعات المستقلة لـ GeoServer خادم تطبيقات Jetty. تمكين مشاركة المصادر المشتركة (CORS) للسماح لتطبيقات JavaScript خارج نطاقك باستخدام GeoServer.

Uncomment التالية <filter> و <filter-mapping> من 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
Yassine Ech-Charafi

أعتقد لا يعد تعطيل CORS من Chrome طريقة جيدة ، لأنه إذا كنت تستخدمه في أيوني ، فمن المؤكد أنه في تطبيق Mobile Build ، ستطرح المشكلة مرة أخرى.

لذلك أفضل لإصلاح في الخلفية الخاصة بك.

بادئ ذي بدء ، في الرأس ، تحتاج إلى ضبط

  • header ('Access-Control-Allow-Origin: *')؛
  • header ('Header set Access-Control-Allow-Headers: "Origin، X-Requested-With، Content-Type، Accept"')؛

وإذا كانت API تتصرف كـ GET و POST كليهما ، فقم أيضًا بتعيين في رأسك

if ($ _SERVER ['REQUEST_METHOD'] == 'OPTIONS') {if (isset ($ _ SERVER ['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))) header ("Access-Control-Allow-Methods: GET، POST، OPTIONS")؛
if (isset ($ _ SERVER ['HTTP_ACCESS_CONTROL_REQUEST_HEADERS'])) رأس ("Access-Control-Allow-Headers:
{$ _ SERVER ['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']} ") ؛ خروج (0) ؛}

0
Shubham Pandey