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:
- İsteğe CORS (Kaynaklar Arası Kaynak Paylaşımı) ile yanıt verin.
- İsteğin bir
Sec-Fetch-Dest: webidentity
HTTP başlığı içerdiğini doğrulayın. Origin
başlığını,client_id
tarafından belirlenen RP kaynağıyla eşleştirin. Eşleşmezlerse reddedin.account_hint
ile eşleşen hesabı bulun.- Kullanıcı hesabının, kısıtlanmış taraf hesapları listesinden bağlantısını kesin.
- 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.