Blog

August 5, 2026

آلية القفل لدينا بعد خمس كلمات مرور خاطئة لم تقفل أحداً على الإطلاق

خمس كلمات مرور خاطئة تقفل الحساب. كان الفحص صحيحاً والعتبة صحيحة، ومع ذلك كان بإمكانك إرسال عشرة آلاف كلمة مرور خاطئة دون أن تُطلق القفل أبداً، ما دمت ترسلها دفعة واحدة. كان العدّاد عملية قراءة وتعديل وكتابة بلا حماية، فكانت المحاولات المتزامنة تدهس زيادات بعضها بعضاً ولا يكاد يرتفع. الإصلاح هو كيف تبني عدّاداً ذرّياً على مخزن مفتاح وقيمة لا يملك عملية زيادة، وإعادة التأطير التي رافقته: افترض أن أحدهم يعدّ بالتوازي.

August 3, 2026

في 2012 استقال الرجل الذي كان يحمل القلم في OAuth 2.0. وتقرأ أسبابه كأنها تنبؤ.

صار الدخول الموحّد معيارًا مستقرًا منذ أكثر من عشرين عامًا، ومع ذلك يظل SAML البند الذي يعطّل الصفقة أو يدفعك إلى الاتصال بفريق المبيعات. كيف تحوّلت مصادقة المؤسسات إلى ترقية مدفوعة، ومن بنى ذلك العالم ومن حذّرنا منه، وما اتساع الخندق الدفاعي حقًا ومِمَّ يتكوّن، والقوة الوحيدة التي تستنزف نصفه بهدوء.

July 31, 2026

أثبتنا أن كل تنبيه يمكن أن ينطلق. لكن معظمها لم يكن كذلك.

المراقبة هي الشيفرة التي لا تعمل إلا أثناء الكارثة، اللحظة الوحيدة التي لا تحتمل أن تجدها معطلة فيها. لذلك بنينا منظومة اختبار تُطلق إشارة حقيقية لكل قاعدة تنبيه، وترفض أن تنجح حتى يصل الإشعار فعليًا إلى مُرحِّل التقاط. كشف أول تشغيل أن تنبيه معدل الأخطاء الرئيسي لدينا ميت تمامًا، ثم كشف ما هو أسوأ: إعداد احتفاظ فرض بصمت انتهاء صلاحية فوريًا على سجلاتنا، فصارت فئة كاملة من التنبيهات تُقيَّم فوق لا شيء بينما بدا استيعاب البيانات سليمًا.

July 30, 2026

نقلنا صورنا إلى شبكة CDN وظل الخادم الأصلي يقدّمها

مئة ميغابايت من لقطات شاشة التوثيق انتقلت إلى Cloudflare R2، خلف قاعدة CDN يشتقّها التطبيق وقت التشغيل من اسم مضيفه. في المتصفح عمل كل شيء، لكنه لم يغيّر شيئًا في حركة الخادم الأصلي، لأن الصفحات التي يراها الزاحف تُصيَّر مسبقًا على 127.0.0.1 حيث لا يدل اسم المضيف على شيء. الحل هو عنصر نائب يحمله HTML خارج البناء وتملؤه الحافة لكل طلب، وسبب اضطراره للعمل هكذا هو نظام ملفات للقراءة فقط.

July 29, 2026

أوقفنا إعدادًا افتراضيًا خطيرًا دون ترحيل صف واحد

كان التزويد الآني (Just-in-time) مفعّلًا افتراضيًا، لذا كان بإمكان أي موفّر هوية موحّد إنشاء حسابات داخل مستأجر أحد العملاء لمجرد أن يؤكّد أن شخصًا ما موجود. إيقاف هذا الإعداد الافتراضي تغيير من كلمة واحدة. أما إيقافه دون أن يغيّر بصمت سلوك كل اتصال مخزَّن بالفعل، ولم يكتب أي منها العمود قط، فهو المشكلة الحقيقية، والحيلة التي حلّتها تفسّر أيضًا لماذا يُعدّ الإعداد الافتراضي جزءًا من واجهة الـ API.

July 28, 2026

BFF لمستأجرين كثيرين، والطلب الوحيد الذي يصل بلا كوكي

يُخرِج نمط backend-for-frontend رموز OAuth من المتصفح فلا يبقى بيده سوى كوكي مبهم. وخدمة مستأجرين كثيرين من BFF واحد هي في معظمها مسألة توصيلات، إلى أن يصل تسجيل الخروج عبر القناة الخلفية: طلب POST من خادم إلى خادم بلا كوكي ولا جلسة ولا متصفح، حيث الشيء الوحيد الذي يحدد المستأجر هو ادعاء داخل رمز لم تتحقق منه بعد.

July 27, 2026

الـ admission webhook الذي قال نعم وأسقطَنا رغم ذلك

أضفنا إلى عنقود Kubernetes لدينا admission webhook يتحقق من التواقيع، حتى لا تعمل أبدًا أي صورة غير موقَّعة. بعد ساعات، كان لدى Deployment واحد 2242 من ReplicaSet، واحد جديد كل ثلاث ثوانٍ، ولا pod متاح واحد. أظهرت سجلات الـ webhook أنه يقبل كل طلب على الإطلاق. جاء الضرر من الكلمة الوحيدة في "mutating admission webhook" التي كنا قد توقفنا عن قراءتها.

July 23, 2026

علّق تسجيل الدخول لدينا لعشر ثوانٍ بالضبط. رؤوس الأمان الخاصة بنا هي التي فعلت ذلك.

كان المستخدم العائد يشاهد كلمة «جارٍ التحميل…» لعشر ثوانٍ بالضبط قبل أن تظهر صفحة تسجيل الدخول، في كل مرة. كان الرقم المستدير هو الدليل: فتحت مكتبة الدخول الموحّد (SSO) لدينا إطار iframe مخفيًّا للتجديد الصامت موجّهًا نحو مضيف مصادقة يقدّم X-Frame-Options: DENY وframe-ancestors 'none'، فلم يُحمَّل الإطار قطّ، ولم يُخطئ قطّ، وانتظرت المكتبة حتى انقضاء مهلتها الزمنية كاملةً. دفاع مكافحة سرقة النقر وتجديد OIDC الصامت، وكلاهما صحيح، علِقا في الوصلة بينهما.

July 22, 2026

HMAC التهم الإكمال التلقائي: البحث الاستباقي في عناوين البريد الإلكتروني المشفرة

قمنا بتشفير كل عناوين البريد الإلكتروني أثناء التخزين، فتوقف مربع البحث في لوحة الإدارة بهدوء عن الإكمال التلقائي: لا خطأ، ولا سطر في السجلات. يعيد الفهرس الأعمى (blind index) إمكانية البحث بالمطابقة التامة فوق النص المشفر، لكن وظيفة HMAC الأساسية هي تدمير الترتيب الذي يحتاجه البحث بالبادئة. إليكم التصميم الذي أعاد البحث الاستباقي (فهرسة كل بادئة كقيمة مستقلة)، والفخاخ الثلاثة التي علمتنا أن التشفير القابل للبحث مشكلة أنظمة، لا مشكلة تشفير.

July 20, 2026

ترحيل واحد إلى ES256، وثلاث طرق لتشويه توقيع صالح

نقلنا توقيع JWT من RS256 إلى ES256، وكان كل رمز نصدره صالحًا تشفيريًا ومرفوضًا في آن واحد. ثلاث مرات، ولثلاثة أسباب مختلفة: DER حيث يريد JWS تنسيق R‖S الخام، وحشو أعداد صحيحة يفشل في رمز واحد من كل 128، ولهجة base64 تغيّرت من تحت أقدامنا. إليك كيف تقرأ البايتات المشوهة وتسمّي الطبقة المذنبة من طول التوقيع وحده.

July 20, 2026

كل عملية تحقق من رمز كانت تصل إلى خادمنا الأصلي. الآن يعيش JWKS على الحافة.

المستندان اللذان تقرؤهما أي خدمة للتحقق من أحد رموز JWT لدينا — مستند الاكتشاف (discovery) وJWKS — هما أكثر ما نقدّمه طلباً وأقلّه سرّيةً، وكانت كل عملية جلب تعود طوال الطريق إلى الأصل (origin). كان تخزينهما مؤقتاً على Cloudflare هو الجزء السهل. أما الجزء الصعب فهو أن ذاكرة مؤقتة قديمة للمفاتيح العامة يجب ألّا ترفض أبداً رمزاً صالحاً، وإليك ترتيبَ العمليات الآمن للتدوير الذي يجعل JWKS المُخزَّن مؤقتاً بقوة آمناً.

July 18, 2026

أرخص تراخيص Duende IdentityServer لا يدعم SAML

تبلغ تكلفة باقة LITE من Duende مبلغ $5,750/yr، لكنها لا تتيح سوى 2 من تطبيقات العملاء ولا تدعم SAML على الإطلاق. وفي اللحظة التي تحتاج فيها إلى SSO للمؤسسات أو إلى تطبيق ثالث، تجد نفسك أمام باقة STANDARD بسعر $12,500. نظرة على ما يكلّفه Duende فعلياً لمنتج حقيقي، وعلى ضريبة عدد التطبيقات التي لا يحذّرك منها أحد.

July 17, 2026

الحيوات الثلاث لمفتاح توقيع JWT الخاص بي

مفتاح خاص واحد يوقّع كل رمز يُصدره خادم المصادقة لدينا، وقد انتقل مرتين في حياته: وُلد داخل العملية، ثم نُفي إلى خزنة لا يستطيع مغادرتها، ثم تناسخ ليصبح نوعاً من المفاتيح أصغر وأسرع تماماً. حدث كل انتقال على جهة إصدار حيّة والرموز في طريقها. إليك ما يتطلبه فعلياً تغييرُ الحيازة والخوارزمية، والتراجعُ الصامت الذي تسلّل مع تغييرة (commit) موصوفة بأنها «أكثر أماناً».

July 16, 2026

توقيع SAML كان صحيحًا. لكن المشكلة لم تكن هناك أصلًا.

تحقّق مزوّد الخدمة لديك من توقيع التأكيد، وثبّت الشهادة، وسجّل دخول المستخدم. كل الفحوص نجحت. ومع ذلك أعدتُ تشغيل عملية تسجيل دخول التقطتها قبل ساعة. الحيلة لم تكن في كسر التوقيع، بل في حذف حقلٍ لم يشمله التوقيع قط.

July 14, 2026

فرضنا MFA. ومعامل استعلام واحد عطّله.

طلبنا العامل الثاني في صفحة تسجيل الدخول ولم نعد التحقق منه عند الـ endpoint الخاص بالـ token. وهكذا مرّت كلمة مرور صحيحة مع URL عودة معدّل يدويًا مباشرة متجاوزة MFA. الإصلاح، والقاعدة التي علّمنا إياها: MFA خاصية للجلسة التي تُصدرها، وليس خطوة في شاشة تسجيل الدخول.

July 14, 2026

ضريبة SCIM: تزويد الحسابات بنية تحتية، لا ميزة فاخرة

SCIM واجهة CRUD قياسية أهم أفعالها هو الفعل الذي يعطّل حساب الموظف المغادر. يسعّرها الموردون بـ 125 دولارًا شهريًا لكل اتصال، أو يضعونها في الباقة المؤسسية إلى جانب SSO. إليك ما يكلفه اتصال SCIM فعلًا لتقديمه، ولماذا يعدّ فرض رسوم على إلغاء التزويد فرضًا لرسوم على الأمان.

July 12, 2026

نسختك الاحتياطية تعيد بهدوء إحياء المستخدمين الذين حذفتهم

لا توجد في Azure Table Storage وDynamoDB علامات حذف، فالصف المحذوف يتلاشى ببساطة، ما يعني أن نسختك الاحتياطية التزايدية لا ترى الحذف إطلاقًا. استعد تلك النسخة وسيعود المستخدم الذي أنهيت حسابه، ومعه كلمة المرور التي تخلصت منها بالتدوير. إليك لماذا يجب أن تكون عمليات الحذف عنصرًا من الدرجة الأولى، والجدول الوحيد الذي يجعلها كذلك.

July 11, 2026

كل آلية تحكم لكل IP شحنّاها كانت قابلة للتجاوز بترويسة واحدة

كان الـ rate limiter وعدّاد قفل الحسابات لدينا يعتمدان على عنوان IP الخاص بالعميل. خلف nginx كان ذلك العنوان يأتي من ترويسة يستطيع العميل ضبطها بنفسه، فكفت ترويسة متغيرة واحدة لمنح كل طلب عنوان IP جديداً وانهارت كل آليات التحكم لكل IP. التزوير بسطر واحد، والإصلاح الذي هو أعقد مما يبدو على Kubernetes.

July 10, 2026

نُشغّل نظام مصادقة بأكمله على مخازن لا تعرف سوى get و put

يمنحك Azure Table Storage مفتاح تقسيم (partition key) ومفتاح صف (row key) ولا شيء آخر تقريباً. لا عمليات ربط (joins)، ولا فهارس ثانوية تستحق الاسم، ولا عامل زيادة. ومع ذلك نُشغّل عليه نظام مصادقة متعدد المستأجرين. الأنماط التي تجعله يعمل، وما الذي تتنازل عنه مقارنةً بـ SQL.

July 9, 2026

نموذج إعادة تعيين كلمة المرور لديك هو مدفع بريد إلكتروني مجاني

نقطة نهاية لإعادة تعيين كلمة المرور غير مُصادَق عليها وبلا تحديد للمعدل لكل بريد إلكتروني ليست مشكلتك وحدك. صوّبها نحو صندوق وارد شخص آخر وتكون قد حوّلت نموذج إعادة التعيين الخاص به إلى مدفع بريد مزعج، محسوب على سمعة المُرسِل لديك. والحل، دون تسريب أي البُرد الإلكترونية لها حسابات.

July 7, 2026

منحنا كل ميزة في الخطة المجانية، بما فيها تلك التي يحتكرها المنافسون لخطط Enterprise

معظم مزوّدي المصادقة يسيّجون SSO وSCIM وMFA وسجلات التدقيق خلف خطة Enterprise. نحن وضعناها كلها في خطة الـ $0. إليك اقتصاديات الوحدة التي تجعل منح الميزات مجانًا أمرًا قابلًا للاستمرار: الجدار لم يكن يومًا هو الميزات، بل المستخدمون النشطون والدعم.

July 6, 2026

أخبرنا مزوّد هوية بمن تكون، فصدّقناه

الدخول الموحّد يعني الوثوق بمزوّد الهوية. وثقنا به في أمر واحد زائد عن الحدّ: كنّا نحلّ هوية المستخدمين المتّحدين العائدين بناءً على البريد الإلكتروني الوارد في التأكيد، فصار بإمكان أي اتصال أن يدّعي عنوان شخص آخر ويهبط على حسابه. لم يكن الإصلاح مزيدًا من التحقّق، بل تغيير مفتاح ربط الهوية من البريد الإلكتروني إلى subject خاص بكل مزوّد لا يستطيع الطرف المؤكِّد تزويره.

July 6, 2026

التوسّع إلى الصفر لا يستطيع العدّ إلى واحد

وعدتنا Azure Container Apps بأن نتوقف عن الدفع مقابل عنقود مصادقة خامل. حسبنا تكلفة الترحيل ثم ألغيناه، لا بسبب السعر ولا البدايات الباردة، بل لأن النموذج اللاخادمي يفتقد الرقم الوحيد الذي تحتاجه فعلاً منصة مصادقة خلفية تعتمد انتخاب قائد.

July 3, 2026

ضريبة SSO بالدولار: كم يكلّف SAML فعليًا في Auth0 وWorkOS وClerk

«ضريبة الميزة» على هيئة فاتورة حقيقية. ثلاثة سيناريوهات للمشتري (أول صفقة enterprise، حفنة من العملاء، SSO كشرط أساسي) محسوبة مقابل الأسعار المعلنة لكل مزوّد. إضافة إلى الرسم الإضافي الصامت الذي لا يحذّرك منه أحد: نفاد عملاء OAuth في منتصف التكامل.

July 1, 2026

آلية اكتشاف الخدمات لدينا التقطت فشلها بنفسها ثم أوقفت نفسها

ظلّت مجموعة من ثلاث نسخ متماثلة تختلف مع نفسها باستمرار. كان السبب في شيفرتنا نحن: إذ احتوى روتين اكتشاف الأقران على كتلة catch تُعطّل الاكتشاف عند فشل multicast، وعلى Kubernetes المُدار يفشل multicast دائمًا. هذه قصة سبب حذفنا gossip بالكامل وانتخابنا قائدًا عبر blob lease بدلًا منه، وسبب تفوّق قائمة عضوية يمكنك فتحها في Storage Explorer على قائمة عضوية مضطر إلى استنتاجها.

June 30, 2026

بناء المصادقة أم شراؤها: الفاتورة التي لا تراها قادمة

تسجيل الدخول عطلة نهاية أسبوع. أما الفاتورة فتصل بعد ذلك: التحقق من التوقيع، وإلغاء التزويد عبر SCIM، وMFA، وسجلات التدقيق، وتدوير المفاتيح، والمسؤولية عن الاختراقات، والمناوبة على نظام من المستوى صفر. مقارنة صادقة بين البناء والشراء، بما في ذلك متى يكون البناء هو الصواب.

June 28, 2026

OIDC أم SAML: أيهما تحتاج فعلاً

OIDC أم SAML؟ نادراً ما يكون لك حق الاختيار. ما هو كل بروتوكول، ومتى يتفوق كل منهما، ومزالق توقيع XML التي تجعل بناء SAML يدوياً أمراً خطيراً، ولماذا ينتهي أي منتج B2B إلى الحاجة لكليهما.

June 26, 2026

دعمٌ يتحدث لغتك. دون أن تضطر إلى أن تطلب.

نظام الدعم من Authagonal: رسائل فورية بلا إعادة تحميل، وترجمة بالذكاء الاصطناعي شفافة في الاتجاهين، مثبَّتة منذ أول رسالة للعميل، ومحادثة تبقى مترجمة بالكامل حتى عبر البريد الإلكتروني. بسيط وأنيق وقادرٌ فعلاً.

June 25, 2026

شَرطة واحدة، مستأجران اثنان، ومفتاح توقيع واحد

اثنان من مستأجرينا كانا في الخفاء المستأجر نفسه: قاعدة بيانات واحدة، ومفتاح توقيع رموز واحد، واسمان مختلفان. كان السبب دالة مساعدة من سطر واحد تُنظّف الـ slugs عبر إزالة الشرطات، فتُحوّل مُعرّفًا فريدًا إلى مُعرّف غير فريد. إليك كيف تحوّل تحويل نصي فاقد للبيانات إلى استيلاء عابر بين المستأجرين، ولماذا اكتشفناه قبل أن تكتشفه أنت.

June 23, 2026

نجاح اختبارات الوحدة لا يعني أنك جاهز للإطلاق

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

June 22, 2026

نسجّل الدخول إلى وحدة تحكم المسؤولين الخاصة بنا عبر SAML الخاص بنا. وإليكم ما كشفه هذا.

تتم المصادقة على وحدة تحكم موظفينا من خلال Authagonal نفسه، مع تكفّل Entra SSO وSCIM بعملية التزويد. أن تكون عميل نفسك يكشف الحالات الحدّية التي لا تفكّر أي مجموعة اختبارات في كتابتها. وهذه هي الحالات التي كان لها أثر فعلي.

June 22, 2026

انقل حالة Terraform بعيدًا عن الإنترنت العام (من دون إقامة VPN)

حالة Terraform لديك هي خريطة كاملة لسحابتك إضافة إلى كومة من الأسرار، وهي تعيش بشكل افتراضي خلف نقطة نهاية عامة. إليك كيف أقمنا الحالة البعيدة من الصفر، ووضعناها خلف نقطة نهاية خاصة، ووصلنا إليها عبر موصل zero-trust بدلًا من دفع ضريبة بوابة VPN، من دون أن نحبس أنفسنا في الخارج قط.

June 21, 2026

استيراد المستخدمين دون إعادة تعيين كلمة المرور

عبارة "الجميع يعيد تعيين كلمة المرور" هي خيار يخص عملية الترحيل، وليست قانوناً من قوانين الفيزياء. إليك كيف تنقل دوال التجزئة الحالية لكلمات مرور مستخدميك عبر انتقال مزود الهوية، بحيث يكون التحول غير محسوس، والحالة الوحيدة التي يتعذّر فيها ذلك فعلاً.

June 20, 2026

ضريبة الميزات: توقف عن الدفع لتفعيل مفاتيح لا تكلف شيئًا

تقيس صناعة المصادقة الإذن، لا التكلفة. فهي تحجب SSO وMFA والتزويد التلقائي خلف باقات ورسوم لكل اتصال، مقابل ميزات لا تكلف تقديمها شيئًا يُذكر. وإليك الفارق الذي تأمل صفحات التسعير ألا تستوعبه أبدًا.

June 18, 2026

مغادرة Duende ذاتية الاستضافة: ما الذي يُرحَّل، وما الذي تتوقف عن تشغيله

الانتقال من Duende IdentityServer ذاتية الاستضافة إلى مصادقة مُدارة: ما الذي يُرحَّل فعليًا من إعدادات SQL ومن ASP.NET Identity، والتكلفة التشغيلية التي تتوقف عن تحمّلها.

June 16, 2026

مغادرة Auth0: ما الذي ينتقل فعلاً، والشيء الوحيد الذي لن يسلّموه لك

نظرة عملية على ما تتطلبه عملية ترحيل Auth0 فعلاً: ما هو سهل، وما هو شائك، والشيء الوحيد الذي لن يمنحك إياه Auth0 حقاً.