تحديثات FedCM: إلغاء ربط واجهة برمجة التطبيقات وتعديلان

اعتبارًا من الإصدار 122 من Chrome، تتوفّر Disconnect API لواجهة برمجة التطبيقات Federated Credential Management API (FedCM). تتيح واجهة برمجة التطبيقات Disconnect API للجهات الموثوق بها إلغاء ربط مستخدميها بحساب مزوّد خدمة تحديد الهوية بدون الاعتماد على ملفات تعريف الارتباط التابعة لجهات خارجية. بالإضافة إلى ذلك، هناك تعديلان على معالجة المواقع الإلكترونية نفسها في FedCM.

إلغاء ربط واجهة برمجة التطبيقات

عندما يُنشئ مستخدم حسابًا في جهة اعتماد (RP - الموقع الإلكتروني الذي يستخدم موفّر الهوية للمصادقة) من خلال ميزة اتحاد الهوية، عادةً ما يسجِّل موفِّر الهوية (IdP) الخدمة التي توفّر معلومات المصادقة والحساب لأطراف أخرى الاتصال في خادمه. يسمح الربط المُخزَّن لـ IdP بتتبُّع خدمات الاعتماد التي سجّل المستخدم الدخول إليها و تحسين تجربته. على سبيل المثال، للحصول على تجربة أفضل عند عودة المستخدم لاحقًا إلى الجهة المحظورة، يتم التعامل مع حساب المستخدم الذي يتضمّن موفِّر الهوية على أنّه حساب مكرّر الزيارة، ما يتيح ميزات مثل إعادة المصادقة التلقائية والأزرار المخصّصة التي تعرض الحساب المستخدَم.

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

تسمح واجهة برمجة التطبيقات Disconnect للمستخدم بقطع اتصال حساب موفِّر الهوية (IdP) بخدمة المعالجة (RP) في المتصفّح وكذلك على خادم موفِّر الهوية (IdP) من خلال إرسال إشارة إليه في نقطة النهاية المحدّدة. يحتاج المستخدم إلى اجتياز ميزة اتحاد الهوية باستخدام واجهة برمجة التطبيقات Federated Credential Management API (FedCM). بعد إلغاء ربط المستخدم، يتم التعامل معه كمستخدم جديد في المرة التالية التي يحاول فيها تسجيل الدخول إلى مقدّم الخدمة باستخدام موفِّر الهوية.

إلغاء ربط موفِّر الهوية بالجهة المحظورة

إذا سبق للمستخدم تسجيل الدخول إلى الجهة المحظورة باستخدام موفِّر الهوية من خلال برنامج FedCM، يتم حفظ العلاقة من خلال المتصفِّح محليًا كقائمة الحسابات المرتبطة. يمكن للجهة المحظورة أن تبدأ قطع الاتصال من خلال استدعاء الوظيفة IdentityCredential.disconnect(). يمكن استدعاء هذه الدالة من إطار RP من المستوى الأعلى. يجب أن يمرر الجهة المحظورة configURL وclientId الذي يستخدمه ضمن موفِّر الهوية وaccountHint لإلغاء ربط موفِّر الهوية. يمكن أن يكون تلميح الحساب سلسلة عشوائية طالما أنّ نقطة نهاية إلغاء الربط يمكنها تحديد الحساب، على سبيل المثال، عنوان بريد إلكتروني أو رقم تعريف مستخدم لا يتطابق بالضرورة مع رقم تعريف الحساب الذي وفّرته نقطة نهاية قائمة الحسابات:

// Disconnect an IdP account "account456" from the RP "https://idp.com/". This is invoked on the RP domain.
IdentityCredential.disconnect({
  configURL: "https://idp.com/config.json",
  clientId: "rp123",
  accountHint: "account456"
});

تعرض الدالة IdentityCredential.disconnect() القيمة Promise. وقد ينتج عن هذا الوعد استثناء للأسباب التالية:

  • لم يسجِّل المستخدم الدخول إلى موفِّر الموارد باستخدام موفِّر الهوية من خلال FedCM.
  • يتم استدعاء واجهة برمجة التطبيقات من داخل إطار iframe بدون سياسة أذونات FedCM.
  • ‎configURL غير صالح أو لا يتضمّن نقطة نهاية لإيقاف الاتصال.
  • تعذَّر فحص سياسة أمان المحتوى (CSP).
  • هناك طلب إلغاء ربط في انتظار المراجعة.
  • أوقَف المستخدم FedCM في إعدادات المتصفّح.

عندما تعرض نقطة نهاية إلغاء الربط في موفِّر الهوية رداً، يتم إلغاء ربط موفِّر الهوية ومسؤول المعالجة في المتصفّح ويتم حلّ الوعد. ويتم تحديد حسابات المستخدمين غير المرتبطة في الاستجابة من نقطة نهاية إلغاء الربط.

إعداد ملف إعدادات موفِّر الهوية

لإتاحة واجهة برمجة التطبيقات "قطع الاتصال"، يجب أن يتيح موفِّر الهوية نقطة نهاية لإلغاء الربط وأن يقدِّم السمة disconnect_endpoint ومسارها في ملف إعداد موفِّر الهوية.

{
  "accounts_endpoint": "/accounts",
  "id_assertion_endpoint": "/assertion",
  ...
  "disconnect_endpoint: "/disconnect"
}

إلغاء ربط الحساب في نقطة نهاية إلغاء الربط

من خلال استدعاء IdentityCredential.disconnect()، يرسل المتصفّح طلب POST من مصادر متعددة يشتمل على ملفات تعريف الارتباط ونوع محتوى application/x-www-form-urlencoded إلى نقطة نهاية إلغاء الربط هذه باستخدام المعلومات التالية:

الموقع الوصف
account_hint تلميح بشأن حساب موفِّر الهوية (idP).
client_id معرّف العميل لمسؤول المعالجة
POST /disconnect HTTP/1.1
Host: idp.example
Origin: rp.example
Content-Type: application/x-www-form-urlencoded
Cookie: 0x123
Sec-Fetch-Dest: webidentity

account_hint=account456&client_id=rp123

عند استلام الطلب، يجب أن يتّبع خادم موفِّر الهوية (idP) ما يلي:

  1. يجب الردّ على الطلب باستخدام مشاركة الموارد المتعدّدة المصادر (CORS).
  2. تأكَّد من أنّ الطلب يحتوي على عنوان HTTP يتضمّن العنصر Sec-Fetch-Dest: webidentity.
  3. طابِق عنوان Origin مع مصدر الجهة المحظورة الذي يحدّده client_id. الرفض في حال عدم التطابق.
  4. ابحث عن الحساب الذي يتطابق مع account_hint.
  5. ألغِ ربط حساب المستخدم من قائمة الحسابات المرتبطة بالجهة المحظورة.
  6. يجب الردّ على المتصفّح باستخدام account_id للمستخدِم المحدَّد بتنسيق JSON .

في ما يلي مثال على حِمل JSON للاستجابة:

{
  "account_id": "account456"
}

إذا كان موفِّر الهوية (idP) يريد من المتصفِّح إلغاء ربط جميع الحسابات المرتبطة بالجهة المحظورة بدلاً من ذلك، أدخِل سلسلة لا تتطابق مع أي رقم تعريف حساب، على سبيل المثال "*".

يتم الآن تخطّي عملية التحقّق من /.well-known/web-identity عندما يكون موفِّر الهوية (RP) وموفِّر الهوية (idP) للموقع الإلكتروني نفسه.

عند تطوير نظام FedCM، قد يكون اختبار نطاقات خادم الجهة المحظورة أو اختبارها هي النطاقات الفرعية لخادم موفِّر الهوية (idP) للإنتاج. على سبيل المثال، يتوفّر خادم موفِّر هوية (idP) للإنتاج في idp.example، ويقع كل من خادم الجهة المحظورة المرحلي وخادم موفِّر الهوية (idP) المرحلي على staging.idp.example. ومع ذلك، بما أنّه يجب وضع ملف well-known في جذر نطاق المستوى الأعلى للمعرّف (eTLD+1) لخادم موفِّر الهوية، يجب أن يكون في idp.example/.well-known/web-identity وهو الخادم المخصّص للإصدار العلني. ولأنّه ليس من الضروري بالضرورة أن يضع المطوّرون الملفات في بيئة الإنتاج أثناء إنشائها، يمنعهم ذلك من اختبار برنامج FedCM.

بدءًا من الإصدار 122 من Chrome، في حال كان نطاق موفِّر الهوية (RP) ونطاق موفِّر الهوية (IdP) متطابقَين، يتخطّى Chrome عملية التحقُّق من الملف المعروف. بهذه الطريقة، سيتمكن المطوّرون من الاختبار في مثل هذا السيناريو.

يمكن للموارد الفرعية الآن ضبط حالة تسجيل الدخول إلى الموقع الإلكتروني نفسه

في السابق، لم يكن يسمح متصفّح Chrome بضبط حالة تسجيل الدخول (على سبيل المثال، باستخدام العنوان Set-Login: logged-in) إلا عندما يكون الطلب هو المصدر نفسه الذي يتضمّن جميع الكيانات الأصلية. وقد أدّى ذلك إلى منع عمليات تسجيل الدخول من خلال طلبات ضبط حالة تسجيل الدخول من خلال الموقع الإلكتروني نفسه "fetch()".

على سبيل المثال، فكّر في موقع إلكتروني يتيح للمستخدمين إدخال اسم المستخدم وكلمة المرور على idp.example، ولكن يتم نشر بيانات الاعتماد على login.idp.example باستخدام fetch(). تعذّر تسجيل حالة تسجيل الدخول إلى المتصفّح باستخدام واجهة برمجة تطبيقات حالة تسجيل الدخول لأنّ النطاقَين من مصادر متعددة وموقع إلكتروني واحد.

بفضل هذا التغيير، خفّفنا متطلبات أن تكون واجهة برمجة التطبيقات لحالة تسجيل الدخول لموقع الويب نفسه مع جميع الكيانات الأصلية، وجعلنا المثال أعلاه ممكنًا ضبط حالة تسجيل الدخول إلى login.idp.example باستخدام عنوان HTTP (Set-Login: logged-in).

ملخّص

باستخدام Disconnect API، يمكن الآن لـ FedCM إلغاء ربط موفِّر الربط بخدمة إدارة الهوية بدون الاعتماد على ملفات تعريف الارتباط التابعة لجهات خارجية. لإجراء ذلك، اتصل بالرقم IdentityCredential.disconnect() على جهاز RP. باستخدام هذه الوظيفة، يُرسِل المتصفّح طلبًا إلى نقطة نهاية إيقاف الاتصال في موفِّر الهوية كي يتمكّن موفِّر الهوية من إنهاء الاتصال على الخادم، ثم على المتصفّح.

لقد أعلنّا أنّه يتم تخطّي عملية فحص "/.well-known/web-identity" عندما يكون الجهة المحظورة وموفِّر الهوية على الموقع الإلكتروني نفسهما لأغراض الاختبار. وأصبح من الممكن الآن ضبط حالة تسجيل الدخول من خلال عنوان استجابة HTTP من المورد الفرعي لموفِّر الهوية للموقع الإلكتروني نفسه.