الانتقال إلى المحتوى الرئيسي
المصادقة ميزة جديدة. كل استدعاء في هذه الصفحة يستخدم بيانات اعتماد المستخدم النهائي أو لا يستخدم أي بيانات اعتماد. لا ترسل أبدًا مفتاح API الخاص بالتحقق أو رمز وحدة التحكم إلى نقاط النهاية هذه.
كل تطبيق هو مُصدِر OpenID Connect مستقل بذاته. والمُصدِر هو أصل صفحة تسجيل الدخول الخاصة بتطبيقك:
  • https://<name>.auth.didit.me لتطبيق في بيئة الإنتاج،
  • https://<name>.sandbox.auth.didit.me للتطبيق التجريبي،
  • أو نطاقك المخصص، بعد تفعيله.
بيئتا الإنتاج والبيئة التجريبية مُصدِران منفصلان بمفاتيح منفصلة. اضبط DIDIT_AUTH_ISSUER على المُصدِر الخاص بك، من دون شرطة مائلة في النهاية، واضبط DIDIT_APPLICATION_ID على معرّف تطبيقك، لأن الرموز تحمله في aud. يشفّر مفتاحك القابل للنشر المُصدِر: فبعد pk_live_ أو pk_test_ يكون المُصدِر بترميز base64url بدون حشو.
عند تفعيل نطاقك المخصص، يحل محل المضيف الافتراضي بوصفه المُصدِر. تحمل الرموز الجديدة اسمه في iss، ويشير اكتشاف الإعدادات إليه في jwks_uri، ويتغير مفتاحك القابل للنشر. ستفشل رموز الوصول الصادرة عن المضيف الافتراضي في GET /session/ إلى أن تُجدَّد. حدّث DIDIT_AUTH_ISSUER عند تفعيل النطاق، أو اقبل المُصدِرَين معًا إلى أن تنتهي صلاحية الرموز الأقدم، خلال 5 دقائق.
نقاط نهاية الخادم في هذه الصفحة (الاكتشاف والمفاتيح والرموز والجلسة) موجودة في مرجع واجهة برمجة تطبيقات المصادقة، وهو مُولَّد من openapi-authentication.json. أما صفحة تسجيل الدخول المستضافة فليست موجودة فيه.

الاكتشاف والمفاتيح

يدعم المُصدِر:
  • نوع الاستجابة code ونمط الاستجابة query.
  • نوعَي المنح authorization_code وrefresh_token.
  • طريقة PKCE S256 فقط. العملاء عامّون: لا يوجد سر للعميل، وclient_id هو معرّف تطبيقك.
  • خوارزمية التوقيع ES256 (مفاتيح P-256).
  • النطاقات openid وemail وphone وprofile وoffline_access.
لا توجد نقاط نهاية لـ userinfo أو introspection أو end-session، وprompt=none غير مدعومة. استخدم GET /session/ لقراءة الجلسة والتحقق منها.

التخزين المؤقت والتدوير

يردّ المستندان بالترويسة Cache-Control: public, max-age=300، لذا يمكنك أنت والذاكرات المؤقتة المشتركة الاحتفاظ بهما 5 دقائق. ويسمحان بـ 1,200 طلب في الدقيقة و12,000 طلب في الساعة لكل عنوان، وهذا أعلى بكثير من نقاط نهاية تسجيل الدخول، لأن كثيرًا من مثيلات الخادم الخلفي تشترك غالبًا في عنوان واحد.
  • لكل مفتاح kid، وتبدأ معرّفات المفاتيح الجديدة بـ k_. ويذكر كل رمز مفتاحه في ترويسة kid.
  • تُدوَّر المفاتيح كل 30 يومًا. ينشر Didit المفتاح التالي قبل يوم من بدء توقيعه به، ويُبقي المفتاح السابق منشورًا ليوم بعد توقفه عن التوقيع. لذلك يستمر JWKS المخزّن مؤقتًا لمدة 5 دقائق في التحقق خلال التدوير.
  • خزّن المفاتيح مؤقتًا بحسب kid. عندما يذكر رمز kid لا تملكه، فأعد جلب JWKS، مرة واحدة على الأكثر في الدقيقة، وارفض الرمز إذا بقي المفتاح مفقودًا.
  • عندما يُبطل Didit مفتاحًا تعرّض للاختراق، يحذفه من JWKS فورًا، وترفض GET /session/ كل رمز وقّعه المفتاح. ويبدأ المفتاح البديل بالتوقيع فورًا، دون يوم النشر المسبق. أما JWKS المخزّن مؤقتًا حتى 5 دقائق قبل ذلك فيظل يقبل المفتاح المُبطل ولا يعرف البديل بعد، لذلك قد تفشل الرموز الجديدة في التحقق دون اتصال إلى أن يتجدد التخزين المؤقت.

بدء تسجيل الدخول

افتح الصفحة المستضافة، وهي authorization_endpoint:
تُنشئ أدلة البدء السريع هذا الطلب نيابةً عنك.

استبدال الرمز

يستقبل رد الاستدعاء code وstate. تحقق من state، ثم استبدل الرمز خلال 60 ثانية. كل رمز يعمل مرة واحدة فقط. ويمكن أن يكون الجسم بصيغة JSON أو بترميز النموذج.
يحسب expires_in الثواني المتبقية من صلاحية رمز الوصول. وعند إيقاف الجلسات المتعددة، ينهي هذا الاستبدال الجلسات الأخرى للشخص.

مطالبات رمز الوصول

رمز الوصول هو JWT رأسه alg: ES256 وtyp: at+jwt. تبلغ مدة صلاحيته 5 دقائق كحد أقصى، ولا تتجاوز أبدًا مدة جلسته. يحمل رمز الهوية الرأس typ: JWT. ويحمل المطالبات نفسها باستثناء client_id، إضافةً إلى auth_time وemail_verified، وكذلك email وname وphone_number عندما تكون لها قيمة. لا يحمل nonce إلا رمز الهوية الناتج عن تبادل الرمز، وذلك إذا كان تسجيل الدخول يتضمن واحدًا، لذا تحقق منه هناك، لأن رموز الهوية الناتجة عن التحديث لا تحمله أبدًا. لا يُقبل رمز الهوية أبدًا بوصفه رمز وصول.

التحقق من رمز على الخادم لديك

تحقق من كل ما يلي قبل أن تثق بأي مطالبة:
  1. يجب أن تكون alg هي ES256 وأن تكون typ هي at+jwt. ارفض أي خوارزمية أخرى، بما فيها none.
  2. يجب أن يكون kid موجودًا في JWKS الخاص بتطبيقك، وأن يتم التحقق من التوقيع.
  3. يجب أن تساوي iss جهة الإصدار المُعدّة لديك، وأن تساوي aud معرّف تطبيقك.
  4. يجب أن تكون exp وiat صالحتين، مع السماح بفرق في ساعة النظام يصل إلى 60 ثانية، وأن تكون sub وsid وjti موجودة.
  5. يجب أن تكون act تساوي null. يُوقَّع رمز وصول وكيل الذكاء الاصطناعي بالمفتاح نفسه، ويحمل typ وiss وaud نفسها، ولا تميّزه إلا act. ارفضه، ما لم تكن endpoint تقبل الوكلاء؛ ففي هذه الحالة اسمح فقط بما تمنحه act.scopes. ترفض GET /session/ دائمًا رمز الوكيل.
خذ جهة الإصدار من إعداداتك، ولا تأخذها من الرمز أبدًا.
لا يستطيع التحقق دون اتصال رؤية جلسة انتهت قبل لحظات. عندما يكون ذلك مهمًا، مثلًا قبل صرف المدفوعات، استدعِ GET /session/.

التحقق من الجلسة

تحتوي الاستجابة على sub وsid وapplication_id وvendor_data وamr وmfa_verified وemail وemail_verified وphone وverified_identity وverified وexpires_at وpost_logout_redirect_uri وorganizations. يحتوي كل إدخال لمؤسسة على organization_id وorganization__name وrole وcustom_role. هذا الفحص أشد صرامة من التحقق دون اتصال. ويفشل أيضًا عند إلغاء الجلسة، أو خمولها، أو تجاوزها مدة صلاحيتها، أو حظر الشخص، أو عدم تحقق بريده الإلكتروني بعد الآن، أو عدم استيفاء الجلسة لسياسة MFA لديك (مثلًا بعد أن يضيف الشخص تطبيق مصادقة، أو يصبح مسؤول مؤسسة)، أو استبدال الرمز بآخر عبر تحديث. يعيد الفشل 401 {"detail": "invalid_token"} مع WWW-Authenticate: Bearer. يسمح GET /session/ بـ 30 طلبًا في الدقيقة و300 طلب في الساعة لكل عنوان IP، وهو حد يشاركه مع DELETE /session/. تحقق من الرموز دون اتصال في كل طلب، واحتفظ بهذا الاستدعاء للحظات التي تحتاجه. يُحسب كل استدعاء ناجح نشاطًا، فيعيد ضبط idle_timeout الخاص بالجلسة. البريد الإلكتروني المُتحقَّق منه ليس تحققًا من الهوية. اقرأ verified لذلك: هنا تكون القيمة null عندما لا يوجد تحقق، بينما تحمل الرموز القيمة {}.

تحديث الرموز

يعيد التحديث رمز وصول جديدًا ورمز هوية جديدًا ورمز تحديث جديدًا، ويتوقف رمز التحديث الذي أرسلته عن العمل.
  • رمز التحديث سلسلة عشوائية، وصالح حتى تنتهي الجلسة.
  • إعادة الاستخدام تُنهي الجلسة. عندما يصل رمز تحديث سبق استخدامه مرة أخرى، تعامله Didit بوصفه علامة على السرقة: فتُلغي الجلسة وتعيد 400 {"error": "invalid_grant"}. تتوقف رموز الجلسة عن العمل أيضًا، بما فيها الرموز الناتجة عن التحديث السابق: يفشل رمز التحديث الخاص بها، ويفشل رمز الوصول في GET /session/ فورًا، مع أنه يبقى قابلًا للتحقق دون اتصال حتى انتهاء صلاحيته، في غضون 5 دقائق.
  • نفّذ تحديثًا واحدًا في كل مرة لكل جلسة، عبر علامات التبويب والأجهزة ومثيلات الخادم، واستبدل الرموز الثلاثة معًا.
  • إذا فشل التحديث بالرمز 400 أو لم يتلقَّ ردًا، فابدأ تسجيل الدخول من جديد. لا تُعِد المحاولة بشكل أعمى: فإعادة المحاولة بعد تحديث نجح تُعد إعادة استخدام.
  • يعني 503 {"error": "temporarily_unavailable"} أن التحديث لم يحدث، وأن رمز التحديث ما زال يعمل. أعد المحاولة مع التراجع التدريجي.
  • ترد Didit بـ 429 قبل تشغيل التحديث، لذا أعد المحاولة بعد Retry-After. تسمح endpoint الرموز بـ 30 طلبًا في الدقيقة و300 طلب في الساعة لكل عنوان IP. وإضافةً إلى ذلك، تتشارك كل طلبات POST وDELETE في تطبيقك حصص حماية من البوتات: 60 طلبًا في الدقيقة لكل عنوان IP عبر تلك الـendpoints، و30 طلبًا في الدقيقة لكل جهاز. وعلى مستوى التطبيق كله، للتحديثات حصة قدرها 6,000 في الدقيقة، ولطلبات POST وDELETE الأخرى (بما في ذلك المتصفحات وخطوات تسجيل الدخول) حصة واحدة قدرها 3,000 في الدقيقة، بحيث لا تستنفد التحديثات عمليات تسجيل الدخول أبدًا.
  • مع رموز وصول مدتها 5 دقائق، تكفي 300 عملية تحديث في الساعة تقريبًا لـ25 شخصًا يبقون نشطين. وإذا كان خادمك يجري التحديث لأشخاص كثيرين من عنوان واحد، فحدّث فقط عندما يحتاج طلب إلى رمز جديد، وحدّث في المتصفح أو التطبيق حيثما أمكن.

تسجيل الخروج

يؤدي طلب DELETE /session/ باستخدام access token الحالي للشخص إلى إنهاء الجلسة، ويعيد 204. يتوقف refresh token الخاص بالجلسة عن العمل، وتفشل access tokens الخاصة بها في GET /session/ فوراً. أما الرموز التي تتحقق منها دون اتصال بالخادم فتبقى صالحة حتى تنتهي مدة صلاحيتها. بعد ذلك، وجّه الشخص إلى post_logout_redirect_uri إذا حددته. يتطلب تسجيل الخروج access token يقبله GET /session/، أي رمز لم تنتهِ مدة صلاحيته ولم يُستبدل بعملية تجديد. تعني الاستجابة 401 أن الجلسة لم تنتهِ. جدّد الرمز أولاً، ثم سجّل الخروج باستخدام access token الجديد. إذا فشل التجديد بالاستجابة 400، فلا يمكن استخدام الجلسة بعد الآن. تنتهي الجلسة أيضاً في الحالات التالية:
  • عند تجاوز session_lifetime (الافتراضي 30 يوماً) أو idle_timeout (الافتراضي يوم واحد)،
  • إذا سجّل الشخص الدخول مرة أخرى وكانت الجلسات المتعددة معطلة،
  • إذا أعاد الشخص تعيين كلمة المرور وكان revoke_on_password_change مفعّلاً،
  • إذا ألغى فريقك الجلسة أو حظر الشخص من وحدة التحكم،
  • إذا أُرسل refresh token سبق استخدامه مرة أخرى.

مدد الصلاحية

تخزين بيانات الاعتماد حسب الغرض

  • احتفظ بمفاتيح API الخاصة بالتحقق ورموز وحدة التحكم على خادمك.
  • احتفظ بـ access tokens الخاصة بالمتصفح في الذاكرة كلما أمكن ذلك. بالنسبة للتطبيقات التي تُعرض من جهة الخادم، استخدم ملفات تعريف الارتباط الآمنة HttpOnly، واحمِ الطلبات المصادَق عليها بملفات تعريف الارتباط من هجمات CSRF.
  • خزّن refresh tokens الخاصة بالتطبيقات المحمولة في وحدة التخزين المحمية من قِبل النظام. امسح الحالة المحلية بعد تسجيل الخروج.
  • لا تضع الرموز أبداً في عناوين URL أو في السجلات.
تابع مع دليل البدء السريع لـ JavaScript، أو دليل البدء السريع لـ Next.js، أو مرجع واجهة برمجة تطبيقات المصادقة.
آخر تعديل في ٧ نوفمبر ٢٠٢٦