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

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

Disconnect API

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

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

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

إلغاء ربط موفِّر الهوية بمسؤول المعالجة

إذا سجّل مستخدم الدخول إلى موفِّر خدمات الربط (RP) من قبل باستخدام موفِّر الهوية (IdP) من خلال FedCM، يحفظ المتصفّح الارتباط محليًا كقائمة بالحسابات المرتبط بها. يمكن أن يبدأ RP عملية قطع الاتصال من خلال استدعاء الدالة 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 API، يجب أن يتيح نقطة نهاية لإلغاء الربط وأن يقدّم موقع disconnect_endpoint ومساره في ملف ملف برمجة التطبيقات لموفِّر الهوية.

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

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

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

الموقع الوصف
account_hint تلميح لحساب موفِّر الهوية
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

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

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

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

{
  "account_id": "account456"
}

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

يتم الآن تخطّي التحقّق من /.well-known/web-identity عندما يكون مقدّم خدمات الربط ومسؤول تعريف الهوية على الموقع الإلكتروني نفسه.

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

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

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

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

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

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

ملخّص

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

لقد أعلنّا أنّه يتم تخطّي عملية التحقّق من /.well-known/web-identity عندما يكون RP وIdentity Provider هما الموقع الإلكتروني نفسه، وذلك لأغراض الاختبار. أصبح من الممكن أيضًا تحديد حالة تسجيل الدخول من خلال عنوان استجابة HTTP من المورد الفرعي لمزوّد خدمة Identification Provider (مزوّد خدمة تحديد الهوية) على الموقع الإلكتروني نفسه.