در پایان این راهنما، CORS را روی یک قانون مسیر فعال می‌کنیم تا مرورگر بتواند از یک مبدا دیگر به این مسیر درخواست ارسال کند و در صورت مجاز بودن، پاسخ را دریافت کند.

برای آشنایی با قانون یکسانی مبدا و Preflight،‏ CORS چیست؟ را مطالعه می‌کنیم. معنی گزینه‌های CORS نیز در مرجع تنظیمات CORS آمده است.


پیش‌نیازها

مراحل

  1. در پنل، از سرویس توزیع محتوا وارد وب‌سایت‌ها می‌شویم و وب‌سایت موردنظر را انتخاب می‌کنیم.

  2. بخش قوانین مسیر (لوکیشن) را باز می‌کنیم و قانون مسیر منبع را ویرایش می‌کنیم؛ برای مثال /api/*.

  3. در چه تنظیماتی بر روی مسیر بالا انجام شود؟، گزینه تنظیمات CORS را انتخاب می‌کنیم.

    تنظیمات CORS

  4. تنظیمات CORS را روشن می‌کنیم.

  5. در Originهای مجاز، مبدا صفحه‌ای را که قرار است به API درخواست بزند، همراه با پروتکل وارد می‌کنیم و هر Origin را در یک خط قرار می‌دهیم.

    برای مثال، اگر برنامه ما روی https://app.example.com قرار دارد، این مقدار را وارد می‌کنیم:

   https://app.example.com

اگر چند برنامه باید به API دسترسی داشته باشند، Origin هرکدام را در یک خط اضافه می‌کنیم.

اگر API عمومی است و می‌خواهیم از هر Origin مجاز باشد، می‌توانیم از * استفاده کنیم. برای درخواست‌های دارای Credential، باید Origin مشخصی را وارد کنیم.

  1. متدهای مجاز را مطابق API انتخاب می‌کنیم.

    برای مثال، اگر API از GET، POST، PUT و DELETE استفاده می‌کند، همین متدها را انتخاب می‌کنیم. متد OPTIONS را انتخاب نمی‌کنیم؛ Preflight توسط Edge پاسخ داده می‌شود.

  2. اگر برنامه برای API هدرهای سفارشی ارسال می‌کند، نام آن‌ها را در هدرهای مجاز و هر هدر را در یک خط وارد می‌کنیم.

    برای مثال، اگر درخواست‌ها شامل Authorization و Content-Type باشند:

    Authorization
    Content-Type
  3. اگر پاسخ API هدر سفارشی دارد که JavaScript باید آن را بخواند، نام آن را در هدرهای Exposed وارد می‌کنیم.

    برای مثال، اگر API هدر X-Request-Id را در پاسخ ارسال می‌کند و برنامه باید مقدار آن را بخواند، X-Request-Id را در این بخش وارد می‌کنیم.

  4. اگر درخواست باید با Credential مانند Cookie ارسال شود، Allow Credential را روشن می‌کنیم.

    برای مثال، اگر https://app.example.com از Cookie برای احراز هویت API استفاده می‌کند، این گزینه را فعال می‌کنیم و در Originهای مجاز همان Origin مشخص را قرار می‌دهیم. در این حالت نمی‌توانیم از * استفاده کنیم.

  5. در صورت نیاز، Max age را برحسب ثانیه وارد می‌کنیم.

    برای مثال، با وارد کردن 86400، مرورگر می‌تواند نتیجه Preflight را تا یک روز نگه دارد.

    مقدار 0 باعث می‌شود هدر Access-Control-Max-Age ارسال نشود.

  6. روی ویرایش قانون مسیر کلیک می‌کنیم.


بررسی صحت

در دستورات زیر، api.example.com و https://app.example.com را با Hostname و Origin موردنظر خود جایگزین می‌کنیم.

  1. یک درخواست Preflight با OPTIONS ارسال می‌کنیم:

    curl -i -X OPTIONS "https://api.example.com/api/items" \
      -H "Origin: https://app.example.com" \
      -H "Access-Control-Request-Method: POST" \
      -H "Access-Control-Request-Headers: Authorization,Content-Type"

    در پاسخ بررسی می‌کنیم که:

    • کد وضعیت، مطابق تنظیمات سرویس، پاسخ موفق Preflight باشد.

    • Access-Control-Allow-Origin با Origin مجاز مطابقت داشته باشد.

    • Access-Control-Allow-Methods شامل POST باشد.

    • Access-Control-Allow-Headers شامل Authorization و Content-Type باشد.

    • اگر Allow Credential فعال است، هدر زیر وجود داشته باشد:

      Access-Control-Allow-Credentials: true
  2. یک درخواست اصلی با همان Origin ارسال می‌کنیم:

    curl -i "https://api.example.com/api/items" \
      -H "Origin: https://app.example.com"

    در پاسخ، وجود Access-Control-Allow-Origin با مقدار Origin مجاز را بررسی می‌کنیم.

    توجه داشته باشیم که curl محدودیت‌های امنیتی مرورگر را اعمال نمی‌کند؛ بنابراین این تست فقط هدرها و پاسخ HTTP را بررسی می‌کند. برای بررسی رفتار واقعی CORS، درخواست را از صفحه‌ای در همان Origin موردنظر نیز ارسال می‌کنیم.

  3. یک درخواست با Origin خارج از فهرست مجاز ارسال می‌کنیم:

    curl -i "https://api.example.com/api/items" \
      -H "Origin: https://evil.example"

    در پاسخ نباید Access-Control-Allow-Origin برای این Origin وجود داشته باشد.

  4. در مشاهده لحظه‌ای لاگ درخواست‌ها، مسیر درخواست را بررسی می‌کنیم تا اطمینان حاصل کنیم درخواست با قانون مسیر موردنظر مطابقت داشته است.

    درخواست Preflight با OPTIONS در صورت فعال بودن CORS در Edge پاسخ داده می‌شود و به آپ‌استریم ارسال نمی‌شود.

اگر مرورگر همچنان خطای CORS نمایش می‌دهد، Origin را دقیقا با مقدار واردشده در تنظیمات مقایسه می‌کنیم. برای مثال، https://example.com و https://www.example.com دو Origin متفاوت هستند.

اگر Allow Credential فعال است، اطمینان حاصل می‌کنیم به‌جای *، Origin دقیق در Originهای مجاز وارد شده است.


ادامه مسیر