Chrome 122'den itibaren Federated Credential Management API (FedCM) için Disconnect API kullanılabilir. Disconnect API, güvenen tarafların üçüncü taraf çerezlerine gerek kalmadan kullanıcılarının kimlik sağlayıcının hesabından bağlantısını kesmesine olanak tanır. Ayrıca, FedCM'nin aynı sitede işleme özelliğinde birkaç güncelleme yapıldı.
API bağlantısını kaldırma
Bir kullanıcı, kimlik federasyonu aracılığıyla güvenen tarafta (RP: kimlik doğrulama için kimlik sağlayıcıyı kullanan site) hesap oluşturduğunda kimlik sağlayıcı (IdP: diğer taraflara kimlik doğrulama ve hesap bilgileri sağlayan hizmet), bağlantıyı genellikle sunucusunda 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.
Bazı durumlarda kimlik sağlayıcılar, hesabın RP 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'den bağlantısını kesmesi için tarayıcı API'si yoktur. Belirli bir RP'ye bağlı, aynı IdP'den birden fazla IdP hesabı olabileceğinden, bağlantıyı kaldırma akışında hangi hesabın bağlantısının kaldırıldığının bilinmesi gerekir.
Disconnect API, kullanıcının belirtilen uç noktaya sinyal göndererek IdP hesabının tarayıcıdaki ve IdP sunucusundaki RP ile bağlantısını kesmesine olanak tanır. Kullanıcının, Federated Credential Management API'yi (FedCM) kullanarak kimlik birleştirme işlemini tamamlamış olması gerekir. Kullanıcının bağlantısı kesildikten sonra, IdP'yi kullanarak RP'de tekrar oturum açmaya çalıştığında yeni bir kullanıcı olarak değerlendirilir.
IdP'nin RP 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. RP, IdentityCredential.disconnect()
işlevini çağırarak bağlantıyı kesebilir. Bu işlev, üst düzey bir RP çerçevesinden çağrılabilir. RP'nin, IdP altında kullandığı clientId
ve IdP'nin bağlantısının kesilmesi için bir accountHint
ile birlikte bir configURL
iletmesi 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'den çağrılıyor.
- configURL geçersiz veya bağlantı kesme uç noktası eksik.
- İç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ış olabilir.
IdP'nin bağlantı kesme uç noktası bir yanıt döndürdüğünde RP ile IdP'nin tarayıcıdaki bağlantısı kesilir ve söz çözülür. Bağlantısı kesilen kullanıcı hesapları, bağlantıyı kesme 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ı sonlandırma 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"
}
Hesabın bağlantısını kesme uç noktasında hesabın bağlantısını kesme
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
Sec-Fetch-Dest: webidentity
HTTP başlığı içerdiğini doğrulayın. Origin
üstbilgisini,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, RP'nin bağlı hesapları listesinden bağlantısını kaldırın.
- 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ü şöyle 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.
RP 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, prodüksiyon IdP sunucusu idp.example
adresinde, hem hazırlık RP sunucusu hem de hazırlık IdP sunucusu staging.idp.example
adresindedir. Ancak, bilinen dosya IdP sunucusunun eTLD+1 köküne yerleştirilmesi gerektiğinden idp.example/.well-known/web-identity
'te olması ve üretim sunucusu olması gerekir. Geliştiricilerin, geliştirme aşamasındayken dosyaları üretim ortamına yerleştirmesi her zaman mümkün olmadığından, FedCM'yi test edemezler.
Chrome 122'den itibaren, RP alanı ve IdP alanı aynıysa Chrome, bilinen dosyayı kontrol etmeyi atlar. Bu sayede geliştiriciler böyle bir senaryoda test 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 durum, giriş durumunu ayarlayan aynı site
fetch()
istekleriyle giriş yapılmasını 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, Giriş Durumu API'sinin tüm üst öğelerle aynı sitede olması şartını hafiflettik. Böylece, yukarıdaki örnekte login.idp.example
'nin giriş durumunu bir HTTP üst bilgisi (Set-Login:
logged-in
) kullanarak ayarlamak mümkün hale geldi.
Ö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, RP 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.