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.
Saat pengguna mengklik tombol Lanjutkan, browser akan membuka dialog untuk halaman login 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 panggilnavigator.login.setStatus("logged-in")
API untuk memberi tahu browser bahwa pengguna telah login. - Panggil
IdentityProvider.close()
untuk menutup dialog.
Anda dapat mencoba perilaku Login Status API di demo kami.
- Ketuk tombol Buka IdP dan login.
- Login dengan akun arbitrer.
- Pilih Sesi Berakhir dari dropdown Status Akun.
- Tekan tombol Perbarui info pribadi.
- 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.
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:
code
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