Update FedCM: Login Status API, Error API, dan Flag API yang Dipilih otomatis

Chrome 120 mengirimkan Login Status API untuk FedCM. Login Status API (sebelumnya dikenal sebagai IdP Sign-in Status API) memungkinkan situs, terutama penyedia identitas, memberikan sinyal ke browser saat pengguna login dan logout. Sinyal ini digunakan oleh FedCM untuk mengatasi masalah serangan pengaturan waktu diam, sehingga memungkinkan FedCM beroperasi tanpa cookie pihak ketiga sama sekali. Update ini mengatasi perubahan terakhir yang tidak kompatibel dengan versi sebelumnya yang sebelumnya kami identifikasi dalam Intent asli untuk Pengiriman FedCM, sebagai bagian dari cakupan pekerjaan kami.

Meskipun Login Status API meningkatkan properti privasi dan kegunaan, perubahan ini tidak kompatibel dengan versi sebelumnya setelah dikirim. Jika Anda sudah memiliki implementasi FedCM, pastikan untuk mengupdatenya menggunakan petunjuk berikut.

Selain itu, Chrome mengirimkan dua fitur Pengelolaan Kredensial Federasi (FedCM) baru:

  • Error API: Memberi tahu pengguna saat upaya login mereka gagal dengan UI native berdasarkan respons server dari endpoint pernyataan ID, jika ada.
  • Auto-Selected Flag API: Memberi tahu penyedia identitas (IdP) dan pihak tepercaya (RP) jika kredensial dipilih secara otomatis dalam alur.

API Status Login

Login Status API adalah mekanisme saat situs, terutama IdP, memberi tahu browser tentang status login pengguna di IdP. Dengan API ini, browser dapat mengurangi permintaan yang tidak perlu ke IdP dan mengurangi potensi serangan pengaturan waktu.

Memberi tahu browser tentang status login pengguna

IdP dapat memberi sinyal status login pengguna ke browser dengan mengirimkan header HTTP atau dengan memanggil JavaScript API saat pengguna login di IdP atau saat pengguna logout dari semua akun IdP mereka. Untuk setiap IdP (yang diidentifikasi melalui URL konfigurasinya), browser menyimpan variabel tri-status yang menampilkan status login dengan kemungkinan nilai logged-in, logged-out, dan unknown. Status defaultnya adalah unknown.

Untuk memberi tahu bahwa pengguna sudah login, kirim header HTTP Set-Login: logged-in dalam navigasi level atas atau permintaan subresource asal yang sama:

Set-Login: logged-in

Atau, panggil JavaScript API navigator.login.setStatus('logged-in') dari asal IdP:

navigator.login.setStatus('logged-in');

Panggilan ini merekam status login pengguna sebagai logged-in. Jika status login pengguna disetel ke logged-in, RP yang memanggil FedCM akan membuat permintaan ke endpoint daftar akun IdP dan menampilkan akun yang tersedia kepada pengguna dalam dialog FedCM.

Untuk menandakan bahwa pengguna logout dari semua akunnya, kirim header HTTP Set-Login: logged-out dalam navigasi tingkat atas atau permintaan subresource asal yang sama:

Set-Login: logged-out

Atau, panggil JavaScript API navigator.login.setStatus('logged-out') dari origin IdP:

navigator.login.setStatus('logged-out');

Panggilan ini merekam status login pengguna sebagai logged-out. Jika status login pengguna adalah logged-out, pemanggilan FedCM akan otomatis gagal tanpa membuat permintaan ke endpoint daftar akun IdP.

Status unknown disetel sebelum IdP mengirim sinyal menggunakan Login Status API. Kami memperkenalkan status ini untuk transisi yang lebih baik, karena pengguna mungkin sudah login ke IdP saat kami mengirimkan API ini. IdP mungkin tidak sempat memberikan sinyal ke browser saat FedCM pertama kali dipanggil. Dalam hal ini, kita membuat permintaan ke endpoint daftar akun IdP dan memperbarui statusnya berdasarkan respons dari endpoint daftar akun:

  • Jika endpoint menampilkan daftar akun aktif, perbarui statusnya menjadi logged-in dan buka dialog FedCM untuk menampilkan akun tersebut.
  • Jika endpoint tidak menampilkan akun, perbarui status menjadi logged-out dan gagalkan panggilan FedCM.

Bagaimana jika sesi pengguna berakhir? Biarkan pengguna login melalui alur login dinamis.

Meskipun IdP terus memberi tahu status login pengguna ke browser, statusnya mungkin tidak sinkron, misalnya saat sesi berakhir. Browser akan mencoba mengirim permintaan berkredensial ke endpoint daftar akun saat status login adalah logged-in, tetapi server tidak menampilkan akun apa pun karena sesi sudah tidak tersedia. Dalam skenario seperti ini, browser dapat secara dinamis mengizinkan pengguna login ke IdP melalui jendela dialog.

Dialog FedCM akan menampilkan pesan yang menyarankan login, seperti yang ditunjukkan pada gambar berikut.

Dialog FedCM yang menyarankan untuk login ke IdP.
Dialog FedCM yang menyarankan untuk login ke IdP.

Saat pengguna mengklik tombol Lanjutkan, browser akan membuka dialog untuk halaman login IdP.

Contoh dialog.
Contoh dialog yang ditampilkan setelah mengklik login ke tombol IdP.

URL halaman login ditentukan dengan login_url sebagai bagian dari file konfigurasi IdP.

{
  "accounts_endpoint": "/auth/accounts",
  "client_metadata_endpoint": "/auth/metadata",
  "id_assertion_endpoint": "/auth/idtokens",
  "login_url": "/login"
  }
}

Dialog ini adalah jendela browser reguler yang memiliki cookie pihak pertama. Apa pun yang terjadi dalam dialog terserah IdP, dan tidak ada handle jendela yang tersedia untuk membuat permintaan komunikasi lintas asal ke halaman RP. Setelah pengguna login, IdP akan:

  • Kirim header Set-Login: logged-in atau panggil navigator.login.setStatus("logged-in") API untuk memberi tahu browser bahwa pengguna telah login.
  • Panggil IdentityProvider.close() untuk menutup dialog.
Pengguna login ke RP setelah login ke IdP menggunakan FedCM.
Pengguna login ke RP setelah login ke IdP menggunakan FedCM.

Anda dapat mencoba perilaku Login Status API di demo kami.

  1. Ketuk tombol Buka IdP dan login.
  2. Login dengan akun arbitrer.
  3. Pilih Sesi Berakhir dari dropdown Status Akun.
  4. Tekan tombol Perbarui info pribadi.
  5. Ketuk tombol Visit the RP to try FedCM.

Anda akan dapat mengamati login ke IdP melalui perilaku modul.

API Error

Saat Chrome mengirim permintaan ke endpoint pernyataan ID (misalnya, saat pengguna mengklik tombol Lanjutkan sebagai di UI FedCM atau autentikasi ulang otomatis dipicu), IdP mungkin tidak dapat mengeluarkan token karena alasan yang sah. Misalnya, jika klien tidak memiliki izin, server untuk sementara tidak tersedia, dan seterusnya. Saat ini, Chrome menggagalkan permintaan secara diam-diam jika terjadi error tersebut dan hanya memberi tahu RP dengan menolak promise.

Dengan Error API, Chrome akan memberi tahu pengguna dengan menampilkan UI native berisi informasi error yang diberikan oleh IdP.

Dialog FedCM yang menampilkan pesan error setelah upaya login pengguna gagal. String ini terkait dengan jenis error.
Dialog FedCM yang menampilkan pesan error setelah upaya login pengguna gagal. String ini terkait dengan jenis error.

API HTTP IdP

Dalam respons id_assertion_endpoint, IdP dapat menampilkan token ke browser jika dapat dikeluarkan berdasarkan permintaan. Dalam proposal ini, jika token tidak dapat dikeluarkan, IdP dapat menampilkan respons "error", yang memiliki dua kolom opsional baru:

  1. code
  2. url
// id_assertion_endpoint response
{
  "error": {
     "code": "access_denied",
     "url": "https://idp.example/error?type=access_denied"
  }
}

Untuk kode, IdP dapat memilih salah satu error yang diketahui dari daftar error yang ditentukan OAuth 2.0 [invalid_request, unauthorized_client, access_denied, server_error, dan temporarily_unavailable] atau menggunakan string arbitrer apa pun. Jika yang kedua, Chrome akan merender UI error dengan pesan error umum dan meneruskan kode ke RP.

Untuk url, kode ini mengidentifikasi halaman web yang dapat dibaca manusia dengan informasi tentang error untuk memberikan informasi tambahan tentang error tersebut kepada pengguna. Kolom ini berguna bagi pengguna karena browser tidak dapat menampilkan pesan error yang kaya dalam UI native. Misalnya, link untuk langkah selanjutnya, informasi kontak layanan pelanggan, dan sebagainya. Jika ingin mempelajari detail error dan cara memperbaikinya lebih lanjut, pengguna dapat mengunjungi halaman yang disediakan dari UI browser untuk mengetahui detail selengkapnya. URL harus berada di situs yang sama dengan IdP configURL.

try {
  const cred = await navigator.credentials.get({
    identity: {
      providers: [
        {
          configURL: 'https://idp.example/manifest.json',
          clientId: '1234',
        },
      ],
    }
  });
} catch (e) {
  const code = e.code;
  const url = e.url;
}

Flag API yang Dipilih Otomatis

mediation: optional adalah perilaku mediasi pengguna default di Credential Management API dan memicu autentikasi ulang otomatis jika memungkinkan. Namun, autentikasi ulang otomatis mungkin tidak tersedia karena alasan bahwa hanya browser yang tahu. Jika tidak tersedia, pengguna mungkin akan diminta untuk login dengan mediasi pengguna eksplisit, yang merupakan alur dengan properti berbeda.

  • Dari perspektif pemanggil API, saat menerima token ID, mereka tidak memiliki visibilitas apakah itu merupakan hasil dari alur autentikasi ulang otomatis. Hal ini menyulitkan mereka untuk mengevaluasi performa API dan meningkatkan UX sebagaimana mestinya.
  • Dari perspektif IdP, keduanya sama-sama tidak dapat mengetahui apakah autentikasi ulang otomatis terjadi atau tidak untuk evaluasi performa. Selain itu, apakah mediasi pengguna eksplisit terlibat dapat membantu mereka mendukung lebih banyak fitur terkait keamanan. Misalnya, beberapa pengguna mungkin lebih memilih tingkat keamanan yang lebih tinggi yang memerlukan mediasi pengguna eksplisit dalam autentikasi. Jika IdP menerima permintaan token tanpa mediasi tersebut, IdP dapat menangani permintaan tersebut secara berbeda. Misalnya, tampilkan kode error sehingga RP dapat memanggil FedCM API lagi dengan mediation: required.

Oleh karena itu, memberikan visibilitas alur autentikasi ulang otomatis akan bermanfaat bagi developer.

Dengan Flag API yang dipilih otomatis, Chrome akan memberitahukan apakah izin pengguna eksplisit diperoleh dengan mengetuk tombol Lanjutkan sebagai dengan IdP dan RP, setiap kali autentikasi ulang otomatis terjadi atau mediasi eksplisit terjadi. Berbagi hanya terjadi setelah izin pengguna diberikan untuk komunikasi IdP/RP.

Berbagi IdP

Untuk membagikan informasi ke izin posting pengguna IdP, Chrome menyertakan is_auto_selected=true dalam permintaan POST yang dikirim ke id_assertion_endpoint:

POST /fedcm_assertion_endpoint HTTP/1.1
Host: idp.example
Origin: https://rp.example/
Content-Type: application/x-www-form-urlencoded
Cookie: 0x23223
Sec-Fetch-Dest: webidentity

account_id=123&client_id=client1234&nonce=Ct0D&disclosure_text_shown=true&is_auto_selected=true

Berbagi RP

Browser dapat membagikan informasi ke RP di isAutoSelected melalui IdentityCredential:

const cred = await navigator.credentials.get({
  identity: {
    providers: [{
      configURL: 'https://idp.example/manifest.json',
      clientId: '1234'
    }]
  }
});

if (cred.isAutoSelected !== undefined) {
  const isAutoSelected = cred.isAutoSelected;
}

Berinteraksi dan berbagi masukan

Jika Anda memiliki masukan atau mengalami masalah selama pengujian, sampaikan di crbug.com.

Foto oleh Cewek bertopi merah di Unsplash