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 دقائق.الاكتشاف والمفاتيح
يدعم المُصدِر:
- نوع الاستجابة
codeونمط الاستجابةquery. - نوعَي المنح
authorization_codeوrefresh_token. - طريقة PKCE
S256فقط. العملاء عامّون: لا يوجد سر للعميل، وclient_idهو معرّف تطبيقك. - خوارزمية التوقيع
ES256(مفاتيح P-256). - النطاقات
openidوemailوphoneوprofileوoffline_access.
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 إلا رمز الهوية الناتج عن تبادل الرمز، وذلك إذا كان تسجيل الدخول يتضمن واحدًا، لذا تحقق منه هناك، لأن رموز الهوية الناتجة عن التحديث لا تحمله أبدًا. لا يُقبل رمز الهوية أبدًا بوصفه رمز وصول.
التحقق من رمز على الخادم لديك
تحقق من كل ما يلي قبل أن تثق بأي مطالبة:- يجب أن تكون
algهيES256وأن تكونtypهيat+jwt. ارفض أي خوارزمية أخرى، بما فيهاnone. - يجب أن يكون
kidموجودًا في JWKS الخاص بتطبيقك، وأن يتم التحقق من التوقيع. - يجب أن تساوي
issجهة الإصدار المُعدّة لديك، وأن تساويaudمعرّف تطبيقك. - يجب أن تكون
expوiatصالحتين، مع السماح بفرق في ساعة النظام يصل إلى 60 ثانية، وأن تكونsubوsidوjtiموجودة. - يجب أن تكون
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 أو في السجلات.