CORS وallowed origins
تحمل مفاتيح Publishable (kld_pk_live_…) قائمة allowed-origins — وهي
browser origins المسموح لها باستخدام المفتاح. اضبطها عند mint للمفتاح (مثل
https://acme.com, https://app.acme.com)؛ ويتطلب live publishable key
واحدًا على الأقل. أما مفاتيح Server (kld_sk_live_…) فلا تحصل على CORS grant، ولذلك لا يمكن للصفحة
قراءة response تم إنشاؤه باستخدامها. لاحظ ما يغطيه ذلك وما لا يغطيه:
CORS يحجب response وليس request — وبالتالي فإن server key المضمن في page
source يكون قد تم كشفه بالفعل. لذلك يرفض SDK
kld_sk_… عند mount؛ فـ server keys مخصصة للاتصال server-to-server فقط.
كيفية التطبيق
- Preflight (
OPTIONS) متساهل — فهو يعكس origin المطلوب لكي يواصل المتصفح العملية (فالمفتاح لا يتم تقديمه في preflight). - الـ request الفعلي يحصل فقط على header باسم
Access-Control-Allow-Originعندما يكونOriginالخاص بالطلب موجودًا في allowed list الخاصة بالمفتاح. أما origin غير الموجود في allowlist فلا يحصل على ACAO header، ولذلك يحجب المتصفح response.
لا توجد cookies — تستخدم platform API مصادقة bearer-token، ولذلك لا يوجد
Access-Control-Allow-Credentials.
تنتقل Publishable keys داخل URLs إلى tile CDN
يأخذ tile.kaleidr.com مفتاح publishable الخاص بك كـ query parameter باسم ?key=. وهذا
مقصود، وله نتيجة يجب توضيحها: query strings يتم
تسجيلها في CDN access logs وbrowser history وأي proxy في المنتصف.
وهذا مقبول لأن publishable key عام بطبيعته — فهو
يصل بالفعل ضمن page source. والتحكم الذي يجعله آمنًا هو
origin allowlist لكل مفتاح، التي يفرضها edge على كل tile request، بالإضافة إلى
تقييد المفتاح بنطاق maps.
وهذا غير مقبول لـ server key. لا تضع kld_sk_… أبدًا داخل URL، وتذكر
أن server key المسرب يكون مكشوفًا بالفعل عندما يرفضه API.
في كل مكان آخر — SDK session exchange وplatform API — ينتقل المفتاح كـ header وليس كـ query parameter.
نصائح
- استخدم bare origins (
scheme://host[:port]) — دون path ودون trailing slash — لكي تتطابق تمامًا مع headerOriginالخاص بالمتصفح. httpsمطلوب باستثناءlocalhost/127.0.0.1(للاختبار المحلي).- استدعاءات server-to-server باستخدام مفتاح server (بدون browser
Origin) لا تخضع لـ CORS، لكنها تستمر في المصادقة وفحص scope بشكل طبيعي. - تدعم server keys أيضًا IP allowlist اختيارية — ويتم رفض أي call
من IP خارج القائمة باستخدام 403
ip_not_allowedحتى عن دما يكون bearer صالحًا. أدِر ذلك في kaleidr.com/api-keys.