Update FedCM: Memutuskan API dan dua update

Mulai Chrome 122, Disconnect API untuk Federated Credential Management API (FedCM) tersedia. Dengan Putuskan API, pihak tepercaya dapat memutuskan koneksi pengguna dari akun penyedia identitas tanpa mengandalkan cookie pihak ketiga. Selain itu, ada beberapa pembaruan untuk penanganan situs yang sama di FedCM.

Disconnect API

Saat pengguna membuat akun pada pihak tepercaya (RP—situs yang menggunakan penyedia identitas untuk autentikasi) melalui penggabungan identitas, penyedia identitas (IdP—layanan yang memberikan autentikasi dan informasi akun ke pihak lain) biasanya merekam koneksi di servernya. Koneksi yang disimpan memungkinkan IdP melacak RP yang telah digunakan pengguna untuk login dan mengoptimalkan pengalaman mereka. Misalnya, untuk mendapatkan pengalaman yang lebih baik saat pengguna kemudian kembali ke RP, akun pengguna dengan IdP diperlakukan sebagai akun yang kembali, yang mengizinkan fitur seperti autentikasi ulang otomatis dan tombol yang dipersonalisasi yang menampilkan akun yang digunakan.

Terkadang, IdP menawarkan API untuk memutuskan hubungan akun dari RP. Namun, alur pemutusan koneksi diautentikasi dan memerlukan cookie IdP. Di dunia tanpa cookie pihak ketiga, saat pengguna mengunjungi RP, tidak ada API browser agar RP dapat diputus hubungannya dari IdP. Karena mungkin ada beberapa akun IdP dari IdP yang sama yang ditautkan ke RP tertentu, alur pemutusan koneksi memerlukan pengetahuan tentang akun mana yang sedang diputuskan koneksinya.

Putuskan Koneksi API memungkinkan pengguna memutuskan sambungan akun IdP dari RP di browser serta di server IdP dengan memberinya sinyal ke endpoint yang ditentukan. Pengguna harus telah melalui penggabungan identitas menggunakan Federated Credential Management API (FedCM). Setelah terputus, pengguna akan diperlakukan sebagai pengguna baru saat mencoba login ke RP menggunakan IdP lagi.

Memutuskan koneksi IdP dari RP

Jika sebelumnya pengguna telah login ke RP menggunakan IdP melalui FedCM, hubungan tersebut akan diingat oleh browser secara lokal sebagai daftar akun yang terhubung. RP dapat memulai pemutusan koneksi dengan memanggil fungsi IdentityCredential.disconnect(). Fungsi ini dapat dipanggil dari frame RP tingkat atas. RP harus meneruskan configURL, clientId yang digunakannya di bawah IdP, dan accountHint agar IdP terputus. Petunjuk akun dapat berupa string arbitrer selama endpoint pemutusan hubungan dapat mengidentifikasi akun, misalnya alamat email atau ID pengguna yang tidak selalu cocok dengan ID akun yang diberikan oleh endpoint daftar akun:

// 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() menampilkan Promise. Promise ini dapat menampilkan pengecualian karena alasan berikut:

  • Pengguna belum login ke RP menggunakan IdP melalui FedCM.
  • API dipanggil dari dalam iframe tanpa kebijakan izin FedCM.
  • configURL tidak valid atau tidak memiliki endpoint pemutusan koneksi.
  • Pemeriksaan Kebijakan Keamanan Konten (CSP) gagal.
  • Ada permintaan pemutusan hubungan yang tertunda.
  • Pengguna telah menonaktifkan FedCM di setelan browser.

Saat endpoint pemutusan IdP yang terjadi menampilkan respons, RP dan IdP akan terputus di browser dan promise akan diselesaikan. Akun pengguna yang terputus ditentukan dalam respons dari endpoint putus.

Menyiapkan file konfigurasi IdP

Untuk mendukung Disconnect API, IdP harus mendukung endpoint putus dan memberikan properti disconnect_endpoint serta jalurnya dalam file konfigurasi IdP.

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

Memutuskan koneksi akun di endpoint yang tidak terhubung

Dengan memanggil IdentityCredential.disconnect(), browser akan mengirimkan permintaan POST lintas origin dengan cookie dan jenis konten application/x-www-form-urlencoded ke endpoint pemutusan koneksi ini dengan informasi berikut:

Properti Deskripsi
account_hint Petunjuk untuk akun IdP.
client_id ID klien RP.
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

Setelah menerima permintaan, server IdP:

  1. Respons permintaan dengan CORS (Cross-Origin Resource Sharing).
  2. Pastikan permintaan berisi header HTTP Sec-Fetch-Dest: webidentity.
  3. Cocokkan header Origin dengan origin RP yang ditentukan oleh client_id. Tolak jika tidak cocok.
  4. Temukan akun yang cocok dengan account_hint.
  5. Putuskan sambungan akun pengguna dari daftar akun yang terhubung ke RP.
  6. Respons browser dengan account_id pengguna yang diidentifikasi dalam format JSON.

Contoh payload JSON respons terlihat seperti ini:

{
  "account_id": "account456"
}

Jika IdP ingin browser memutuskan sambungan semua akun yang terkait dengan RP, teruskan string yang tidak cocok dengan ID akun apa pun, misalnya "*".

Pemeriksaan /.well-known/web-identity kini dilewati jika RP dan IdP berada di situs yang sama

Saat mengembangkan sistem FedCM, domain server RP pengujian atau staging dapat berupa subdomain server IdP produksi. Misalnya, server IdP produksi berada di idp.example dan server RP staging serta server IdP staging berada di staging.idp.example. Namun, karena file terkenal harus ditempatkan di root eTLD+1 server IdP, file harus berada di idp.example/.well-known/web-identity dan merupakan server produksi. Karena tidak mungkin developer menempatkan file di lingkungan produksi saat sedang dalam pengembangan, developer tidak dapat menguji FedCM.

Mulai Chrome 122, jika domain RP dan domain IdP sama, Chrome akan melewati pemeriksaan file yang dikenal. Dengan cara ini, developer akan dapat melakukan pengujian dalam skenario tersebut.

Sub-resource kini dapat menetapkan status login situs yang sama

Sebelumnya, Chrome hanya mengizinkan setelan status login (misalnya, menggunakan header Set-Login: logged-in) jika permintaan tersebut merupakan origin yang sama dengan semua ancestor. Tindakan ini mencegah login melalui permintaan fetch() situs yang sama yang menyetel status login.

Misalnya, bayangkan situs yang memungkinkan pengguna memasukkan nama pengguna dan sandi mereka di idp.example, tetapi kredensial diposting ke login.idp.example dengan fetch(). Perekaman status login ke browser menggunakan Login Status API tidak dapat dilakukan karena kedua domain tersebut adalah lintas origin dan situs yang sama.

Dengan perubahan ini, kami telah melonggarkan persyaratan untuk Login Status API menjadi situs yang sama dengan semua ancestor dan memungkinkan contoh di atas untuk menetapkan status login login.idp.example menggunakan header HTTP (Set-Login: logged-in).

Ringkasan

Dengan menggunakan Disconnect API, FedCM kini dapat memutuskan koneksi RP dari IdP tanpa mengandalkan cookie pihak ketiga. Untuk melakukannya, panggil IdentityCredential.disconnect() di RP. Dengan fungsi ini, browser mengirimkan permintaan ke endpoint pemutusan IdP sehingga IdP dapat menghentikan koneksi di server, lalu di browser.

Kami telah mengumumkan bahwa pemeriksaan /.well-known/web-identity dilewati jika RP dan IdP berada di situs yang sama, untuk tujuan pengujian. Selain itu, menetapkan status login melalui header respons HTTP dari sub-resource IdP situs yang sama kini mungkin.