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

Chrome 122'den itibaren Federated Credential Management API (FedCM) için Disconnect 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ının hesabıyla bağlantısını kesmesine olanak tanır. Ayrıca, FedCM'nin aynı siteyi işleme sürecinde de birkaç güncelleme var.

API bağlantısını kaldırma

Bir kullanıcı, kimlik federasyonu aracılığıyla bağlı taraftan (kimlik, kimlik sağlayıcıyı kullanan site) hesap oluşturduğunda kimlik sağlayıcı (IdP (IdP), diğer taraflara kimlik doğrulama ve hesap bilgilerini sağlayan hizmet) genellikle bağlantıyı kendi sunucusuna kaydeder. Depolanan bağlantı, kimlik sağlayıcının 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 yaşamak için IdP'ye sahip kullanıcı hesabı, geri gelen hesap olarak değerlendirilir. Bu sayede otomatik yeniden kimlik doğrulama ve kullanılan hesabı gösteren kişiselleştirilmiş düğmeler gibi özelliklerden yararlanılabilir.

IdP'ler bazen hesabın kısıtlanmış taraf ile bağlantısını kesmek için bir API sunar. Ancak bağlantı kesme akışında kimlik doğrulaması yapılır ve IdP çerezleri gerekir. Üçüncü taraf çerezlerinin olmadığı bir dünyada, kullanıcı RP'yi ziyaret ettiğinde RP'nin IdP ile bağlantısını kesebileceği bir tarayıcı API'si yoktur. Belirli bir Kısıtlanmış Taraf'a bağlı aynı IdP'de birden fazla IdP hesabı olabileceğinden, bağlantı kesme akışı hangi hesabın bağlantısının kesildiğini öğrenmenizi gerektirir.

Bağlantıyı Kesme API'si, kullanıcının IdP hesabının hem tarayıcıda hem de IdP sunucusunda belirtilen uç noktaya sinyal göndererek IdP sunucusuyla olan bağlantısını kesmesine olanak tanır. Kullanıcının Federated Credential Management API'yi (FedCM) kullanarak kimlik federasyonundan geçmiş olması gerekir. Kullanıcının bağlantısı kesildikten sonra, IdP'yi kullanarak Kısıtlanmış Taraf'ta bir sonraki oturum açışında yeni kullanıcı olarak kabul edilir.

IdP'nin Kısıtlanmış Taraf ile bağlantısını kesme

Bir kullanıcı daha önce FedCM üzerinden IdP'yi kullanarak RP'de oturum açtıysa ilişki, tarayıcı tarafından bağlı hesapların listesi olarak yerel olarak ezberlenir. Kısıtlanmış taraf, IdentityCredential.disconnect() işlevini çağırarak bir bağlantı kesme başlatabilir. Bu işlev, üst düzey bir RP çerçevesinden çağrılabilir. IdP'nin bağlantısının kaldırılması için RP'nin bir configURL, IdP altında kullandığı clientId ve accountHint geçirmesi gerekir. Bağlantıyı kesme uç noktası hesabı tanımlayabileceği sürece hesap ipucu herhangi bir dize olabilir. Örneğin, hesap listesi uç noktasının sağladığı hesap kimliğiyle eşleşmesi gerekmeyen 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(), Promise döndürür. Bu söz aşağıdaki nedenlerle istisna atabilir:

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

IdP'nin bağlantı kesme uç noktası bir yanıt döndürdüğünde, RP ve IdP'nin tarayıcıda bağlantısı kesilir ve vaat yerine getirilir. Bağlantısı kesilen kullanıcı hesapları, bağlantı kesilen uç noktasından gelen yanıtta belirtilir.

IdP yapılandırma dosyasını ayarlama

Disconnect API'yi desteklemek için IdP'nin bağlantıyı kesme uç noktasını desteklemesi ve disconnect_endpoint mülkünü ile yolunu IdP yapılandırma dosyasında 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ı kesin

Tarayıcı, IdentityCredential.disconnect()'ü çağırarak çerezleri ve application/x-www-form-urlencoded içerik türünü içeren bir kaynakta çapraz POST isteği gönderir. Bu istekte aşağıdaki bilgiler yer alır:

Mülk Açıklama
account_hint IdP hesabıyla ilgili ipucu.
client_id RP'nin 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

IdP sunucusu, isteği aldıktan sonra:

  1. İsteğe CORS (Kaynaklar Arası Kaynak Paylaşımı) ile yanıt verin.
  2. İsteğin bir Sec-Fetch-Dest: webidentity HTTP başlığı içerdiğini doğrulayın.
  3. Origin başlığını, client_id tarafından belirlenen RP kaynağıyla eşleştirin. Eşleşmezlerse reddedin.
  4. account_hint ile eşleşen hesabı bulun.
  5. Kullanıcı hesabının, kısıtlanmış taraf hesapları listesinden bağlantısını kesin.
  6. Tanımlanmış kullanıcının account_id değerini JSON biçiminde tarayıcıya yanıt olarak gönderin.

Örnek bir yanıt JSON yükü şu şekilde görünür:

{
  "account_id": "account456"
}

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

Kısıtlanmış taraf ve IdP aynı sitede olduğunda /.well-known/web-identity kontrolü artık atlanıyor

FedCM sistemi geliştirirken test veya hazırlık RP sunucusu alanları, üretim IdP sunucusunun alt alan adları olabilir. Örneğin, üretim IdP sunucusu idp.example konumunda ve hem hazırlık RP sunucusu hem de hazırlık IdP sunucusu staging.idp.example adresinde. Ancak, iyi bilinen dosyanın IdP sunucusunun eTLD+1'inin köküne yerleştirilmesi gerektiği için bu dosyanın idp.example/.well-known/web-identity konumunda ve üretim sunucusunda olması gerekir. Geliştiricilerin geliştirme sırasında dosyaları üretim ortamına yerleştirmeleri mümkün olmadığından bu durum FedCM'yi test etmelerini engeller.

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

Alt kaynaklar artık aynı sitede oturum açma durumunu ayarlayabilir

Daha önce Chrome, yalnızca istek tüm üst öğelerle aynı kaynakta olduğunda giriş durumunu (örneğin, Set-Login: logged-in üstbilgisi kullanılarak) ayarlamaya izin veriyordu. Bu, giriş durumunu belirleyen aynı site fetch() istekleri üzerinden yapılan girişleri engelledi.

Örneğin, kullanıcıların idp.example adresinde kullanıcı adı ve şifrelerini girmesine izin veren ancak kimlik bilgilerinin fetch() ile login.idp.example adresine gönderildiği bir web sitesini düşünün. İki alan çapraz kaynaklı ve aynı sitede olduğu için Oturum Durumu API'sini kullanarak oturum durumunu tarayıcıya kaydetmek mümkün değildi.

Bu değişiklikle birlikte, Login Status API'nin tüm üst öğelerle aynı site olma koşulunu hafiflettik ve yukarıdaki örnekte, login.idp.example adresinin giriş durumunun HTTP başlığı (Set-Login: logged-in) kullanarak ayarlanmasını mümkün hale getirdik.

Özet

FedCM, Disconnect API'yi kullanarak artık üçüncü taraf çerezlerine gerek kalmadan RP'nin IdP'den bağlantısını kesebilir. Bunu yapmak için RP'de IdentityCredential.disconnect() numaralı hattı arayın. Bu işlevle tarayıcı, IdP'nin bağlantıyı sonlandırma uç noktasına bir istek gönderir. Böylece IdP, bağlantıyı önce sunucuda, ardından tarayıcıda sonlandırabilir.

Test amacıyla, Kısıtlanmış Taraf ve IdP aynı sitede olduğunda /.well-known/web-identity kontrolünün atlandığını duyurmuştuk. Ayrıca, aynı sitedeki IdP alt kaynağından bir HTTP yanıtı üst bilgisi aracılığıyla giriş durumu ayarlamak artık mümkün.