FedCM güncellemeleri: API bağlantısını kesme ve iki güncelleme

Chrome 122'de Federated Credential Management API (FedCM) için Connection API kullanılabilir. Bağlantıyı Kesme API'si, bağlı tarafların, üçüncü taraf çerezlerine gerek kalmadan kullanıcılarının kimlik sağlayıcı hesabıyla olan bağlantısını kesmesine olanak tanır. Ayrıca, FedCM'nin aynı site yönetimi ile ilgili birkaç güncelleme var.

API bağlantısını kes

Bir kullanıcı, kimlik federasyonu aracılığıyla bağlı bir taraf (kimlik doğrulaması için kimlik sağlayıcıyı kullanan site) olan RP'de hesap oluşturduğunda, kimlik sağlayıcı (IdP (diğer taraflara kimlik doğrulama ve hesap bilgileri sağlayan hizmet) genellikle bağlantıyı kendi sunucusuna kaydeder. Depolanan bağlantı, IdP'nin kullanıcının oturum açtığı RP'leri takip etmesine ve deneyimini optimize etmesine olanak tanır. Örneğin, kullanıcı daha sonra RP'ye geri döndüğünde daha iyi bir deneyim elde etmek için IdP'ye sahip kullanıcı hesabı, geri gelen bir hesap olarak değerlendirilir. Bu hesap, otomatik yeniden kimlik doğrulama ve kullanılan hesabı gösteren kişiselleştirilmiş düğmeler gibi özelliklere olanak tanır.

IdP'ler bazen hesabın bir kısıtlanmış taraf ile bağlantısını kesmek için bir API sunar. Ancak, bağlantı kesme akışı doğrulanır ve IdP çerezlerini gerektirir. Üçüncü taraf çerezlerinin olmadığı bir dünyada, kullanıcı RP'yi ziyaret ettiğinde RP'nin IdP ile bağlantısını kesecek bir tarayıcı API'si olmaz. Aynı IdP'den belirli bir RP'ye bağlı birden fazla IdP hesabı olabileceğinden, bağlantı kaldırma akışı hangi hesabın bağlantısının kesildiğini bilmeyi gerektirir.

Bağlantıyı Kesme API'si, kullanıcının IdP hesabını belirtilen uç noktaya yönlendirerek hem tarayıcıdaki hem de IdP sunucusundaki IdP hesabı ile bağlantısını kesmesine olanak tanır. Kullanıcının, Federated Credential Management API'yi (FedCM) kullanarak kimlik federasyonundan yararlanmış olması gerekir. Kullanıcının bağlantısı kesildikten sonra, IdP'yi kullanarak RP'de tekrar oturum açmaya çalıştığında bu kullanıcı yeni kullanıcı olarak değerlendirilir.

IdP'nin RP ile bağlantısını kesme

Bir kullanıcı daha önce IdP'yi kullanarak FedCM üzerinden RP'de oturum açtıysa bu ilişki, tarayıcı tarafından yerel olarak bağlı hesapların listesi olarak hatırlanır. RP, IdentityCredential.disconnect() işlevini çağırarak bağlantı kesme işlemi başlatabilir. Bu işlev, üst düzey bir RP çerçevesinden çağrılabilir. Kısıtlanmış tarafın bir configURL, IdP altında kullandığı clientId ve IdP'nin bağlantısının kesilebilmesi için bir accountHint iletmesi gerekir. Hesap ipucu, bağlantıyı kesme uç noktası hesabı tanımlayabildiği sürece rastgele bir dize olabilir. Örneğin, hesap listesi uç noktasının sağladığı hesap kimliğiyle eşleşmeyen bir e-posta adresi veya kullanıcı kimliği:

// 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() bir Promise döndürür. Bu vaat aşağıdaki nedenlerle istisnaya yol açabilir:

  • Kullanıcı, FedCM üzerinden IdP'yi kullanarak RP'de oturum açmamıştır.
  • API, FedCM izin politikası olmayan bir iframe içinden çağrılır.
  • configURL geçersiz veya bağlantı kesme uç noktası eksik.
  • İçerik Güvenliği Politikası (İGP) kontrolü başarısız oluyor.
  • Bekleyen bir bağlantı kaldırma isteği var.
  • Kullanıcı, tarayıcı ayarlarında FedCM'yi devre dışı bırakmış.

IdP'nin bağlantı kesme uç noktası yanıt döndürdüğünde, tarayıcıda RP ve IdP bağlantısı kesilir ve söz konusu çözüm sonlandırılır. Bağlantısı kesilen kullanıcı hesapları, bağlantı noktasının bağlantı noktasından gelen yanıtta belirtilmiştir.

IdP yapılandırma dosyasını ayarlayın

Connection API'yi desteklemek için IdP'nin bir bağlantıyı kesme uç noktasını desteklemesi ve IdP yapılandırma dosyasında disconnect_endpoint özelliği ile yolunu sağlaması gerekir.

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

Bağlantı kesme uç noktasında hesabın bağlantısını kesme

Tarayıcı IdentityCredential.disconnect() yöntemini çağırarak bu bağlantı kesme uç noktasına çerezler ve içerik türü içeren application/x-www-form-urlencoded ile çapraz kaynak POST isteği gönderir ve aşağıdaki bilgileri içerir:

Özellik Açıklama
account_hint IdP hesabıyla ilgili ipucu.
client_id Kısıtlanmış tarafın istemci tanımlayıcısı.
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

İstek alındıktan sonra IdP sunucusu:

  1. İsteği CORS (Ortamlar Arası Kaynak Paylaşımı) ile yanıtlayın.
  2. İsteğin Sec-Fetch-Dest: webidentity HTTP üst bilgisi içerdiğini doğrulayın.
  3. Origin başlığını, client_id tarafından belirlenen kısıtlanmış taraf kaynağıyla eşleştirin. Eşleşmiyorlarsa reddedin.
  4. account_hint ile eşleşen hesabı bulun.
  5. Kullanıcı hesabının, kısıtlanmış tarafın bağlı hesapları listesinden bağlantısını kesin.
  6. Tanımlanan kullanıcının account_id bilgisiyle tarayıcıya JSON biçiminde yanıt verin.

Örnek yanıt JSON yükü aşağıdaki gibi görünür:

{
  "account_id": "account456"
}

IdP, tarayıcının bunun yerine RP ile ilişkilendirilmiş tüm hesapların bağlantısını kesmesini istiyorsa herhangi bir hesap kimliğiyle eşleşmeyen bir dize (ör. "*") iletin.

RP ve IdP aynı site olduğunda /.well-known/web-identity kontrolü artık atlanıyor

Bir FedCM sistemi geliştirirken, test veya hazırlık RP sunucusu alanları, üretim IdP sunucusunun alt alanları olabilir. Örneğin, üretim IdP sunucusu idp.example adresinde ve hem hazırlık RP sunucusu hem de hazırlık IdP sunucusu staging.idp.example. Ancak, iyi bilinen dosyanın IdP sunucusunun eTLD+1'inin köküne yerleştirilmesi gerektiğinden, dosyanın idp.example/.well-known/web-identity konumunda olması gerekir ve bu, üretim sunucusudur. Geliştiricilerin geliştirme aşamasında üretim ortamına dosya yerleştirmeleri mümkün olmadığından FedCM'yi test etmeleri engellenir.

Chrome 122'den itibaren, RP alanı ve IdP alanı aynıysa Chrome, bilinen dosyayı kontrol etmeyi atlar. Böylece geliştiriciler böyle bir senaryoda test yapabilir.

Alt kaynaklar artık aynı site giriş durumunu ayarlayabilir

Önceden, Chrome yalnızca isteğin tüm üst öğelerle aynı kaynak olduğunda giriş durumunun ayarlanmasına (örneğin, Set-Login: logged-in üstbilgisinin kullanılmasına) izin veriyordu. Bu da aynı siteden fetch() isteklerinin giriş durumunu belirlemesini engelledi.

Örneğin, kullanıcıların idp.example üzerinde kullanıcı adlarını ve şifrelerini girmelerine izin veren, ancak kimlik bilgilerinin fetch() ile login.idp.example adresinde yayınlandığı bir web sitesini düşünün. Giriş Durumu API'sini kullanarak giriş durumunun tarayıcıya kaydedilmesi mümkün değildi, çünkü iki alan adı çapraz kaynak ve aynı site durumundaydı.

Bu değişiklikle, Login Status API'nin tüm üst öğelerle aynı sitede olması şartını hafiflettik ve yukarıdaki örnek, login.idp.example'in giriş durumunu HTTP üst bilgisi (Set-Login: logged-in) kullanarak ayarlamayı mümkün kılıyor.

Özet

FedCM, Connected API'yi kullanarak artık üçüncü taraf çerezlerine gerek kalmadan RP'nin IdP ile bağlantısını kesebilir. Bunun için kısıtlanmış tarafta IdentityCredential.disconnect() numaralı telefonu arayın. Bu işlev sayesinde tarayıcı, IdP'nin sunucudaki ve ardından tarayıcıdaki bağlantıyı sonlandırabilmesi için IdP'nin bağlantı kesme uç noktasına bir istek gönderir.

Test amacıyla, RP ve IdP aynı sitedeyken /.well-known/web-identity kontrolünün atlandığını duyurmuştuk. Ayrıca, artık aynı sitenin IdP alt kaynağından HTTP yanıt başlığı aracılığıyla bir giriş durumu ayarlamak mümkündür.