Chrome 120, FedCM için Giriş Durumu API'sini kullanıma sunuyor. Giriş Durumu API'si (eski adıyla IdP Oturum Açma Durumu API'si), özellikle kimlik sağlayıcılar olmak üzere web sitelerinin kullanıcıları oturum açtığında ve kapattığında tarayıcıya sinyal göndermesine olanak tanır. Bu sinyal, sessiz zamanlama saldırısı sorununu gidermek için FedCM tarafından kullanılır ve bu sayede FedCM'nin tamamen üçüncü taraf çerezleri olmadan çalışmasına olanak tanır. Bu güncelleme, çalışma kapsamımız kapsamında, daha önce FedCM'nin orijinal Gönderim Niyeti'nde tespit ettiğimiz ve geriye dönük uyumlu olmayan son değişiklikleri ele almaktadır.
Giriş Durumu API'si, gizlilik özelliğini ve kullanılabilirliği iyileştirse de kullanıma sunulduktan sonra geriye dönük olarak uyumlu olmayan bir değişikliktir. Mevcut bir FedCM uygulamanız varsa aşağıdaki talimatları uygulayarak güncellediğinizden emin olun.
Ayrıca Chrome, iki yeni Federated Credential Management (FedCM) özelliğini kullanıma sunuyor:
- Error API: Oturum açma denemeleri başarısız olan kullanıcıları, kimlik beyanı uç noktasından gelen sunucu yanıtına göre yerel bir kullanıcı arayüzüyle bilgilendirin (varsa).
- Otomatik Seçilen İşaret API'si: Akışta otomatik olarak bir kimlik bilgisi seçildiyse kimlik sağlayıcıyı (IdP) ve güvenen tarafı (RP) bilgilendirin.
Login Status API
Giriş Durumu API'si, bir web sitesinin (özellikle de IdP'nin) tarayıcıya kullanıcının IdP'deki giriş durumunu bildirdiği bir mekanizmadır. Tarayıcı bu API ile kimlik sağlayıcıya yapılan gereksiz istekleri azaltabilir ve olası zamanlama saldırılarını azaltabilir.
Tarayıcıyı kullanıcının giriş durumu hakkında bilgilendirme
Kimlik sağlayıcılar, kullanıcı IdP'de oturum açtığında veya tüm IdP hesaplarından oturum kapattığında bir HTTP başlığı göndererek ya da bir JavaScript API'yi çağırarak kullanıcının giriş durumunu tarayıcıya bildirebilir. Tarayıcı, her IdP (yapılandırma URL'si ile tanımlanır) için logged-in
, logged-out
ve unknown
olası değerlerine sahip giriş durumunu temsil eden üç durumlu bir değişken tutar. Varsayılan durum unknown
'tir.
Kullanıcının oturum açtığını belirtmek için üst düzey gezinme veya aynı kaynak alt kaynağı isteğinde Set-Login: logged-in
HTTP başlığı gönderin:
Set-Login: logged-in
Alternatif olarak, JavaScript API'yi navigator.login.setStatus('logged-in')
IdP kaynağından çağırın:
navigator.login.setStatus('logged-in');
Bu çağrılar, kullanıcının oturum açma durumunu logged-in
olarak kaydeder. Kullanıcının giriş durumu logged-in
olarak ayarlandığında, FedCM'yi çağıran RP, kimlik sağlayıcının hesap listesi uç noktasına istek gönderir ve FedCM iletişim kutusunda kullanıcıya mevcut hesapları gösterir.
Kullanıcının tüm hesaplarında oturumunun kapatıldığını belirtmek için üst düzey bir gezinme veya aynı kaynaktan alt kaynak isteği gönderirken Set-Login:
logged-out
HTTP üstbilgisini gönderin:
Set-Login: logged-out
Alternatif olarak, JavaScript API'yi navigator.login.setStatus('logged-out')
kimlik sağlayıcı kaynağından çağırabilirsiniz:
navigator.login.setStatus('logged-out');
Bu çağrılar, kullanıcının oturum açma durumunu logged-out
olarak kaydeder. Kullanıcının giriş durumu logged-out
olduğunda, FedCM çağrısı, kimlik sağlayıcının hesap listesi uç noktasına istek göndermeden sessizce başarısız olur.
unknown
durumu, IDP'nin LoginStatus API'yi kullanarak sinyal göndermesinden önce ayarlanır. Bu API'yi kullanıma sunduğumuzda kullanıcının IdP'de oturum açmış olabileceği için daha iyi bir geçiş sağlamak amacıyla bu durumu kullanıma sunduk. FedCM ilk kez çağrılana kadar kimlik sağlayıcının bunu tarayıcıya bildirme şansı olmayabilir. Bu durumda, kimlik sağlayıcının hesap listesi uç noktasına bir istek göndeririz ve hesap listesi uç noktasından gelen yanıta göre durumu güncelleriz:
- Uç nokta, etkin hesapların listesini döndürürse durumu
logged-in
olarak güncelleyin ve bu hesapları göstermek için FedCM iletişim kutusunu açın. - Bitiş noktası hiçbir hesap döndürmezse durumu
logged-out
olarak güncelleyin ve FedCM çağrısını başarısız kılın.
Kullanıcı oturumunun süresi dolarsa ne olur? Kullanıcının dinamik bir giriş akışı üzerinden oturum açmasına izin verin.
IdP, kullanıcının giriş durumunu tarayıcıya bildirmeye devam etse de oturum süresi dolduğunda durum senkronize olmayabilir. Giriş durumu logged-in
olduğunda tarayıcı, hesap listesi uç noktasına kimlik bilgisi içeren bir istek göndermeye çalışır ancak oturum artık kullanılamadığı için sunucu hiçbir hesap döndürmez. Böyle bir senaryoda tarayıcı, kullanıcının bir iletişim kutusu aracılığıyla IdP'de dinamik olarak oturum açmasına izin verebilir.
FedCM iletişim kutusunda, aşağıdaki resimde gösterildiği gibi oturum açmanızı öneren bir mesaj görüntülenir.

Kullanıcı Devam düğmesini tıkladığında tarayıcı, kimlik sağlayıcının giriş sayfası için bir iletişim kutusu açar.

Giriş sayfası URL'si, IdP yapılandırma dosyasının bir parçası olarak login_url
ile belirtilir.
{
"accounts_endpoint": "/auth/accounts",
"client_metadata_endpoint": "/auth/metadata",
"id_assertion_endpoint": "/auth/idtokens",
"login_url": "/login"
}
}
İletişim kutusu, birinci taraf çerezleri içeren normal bir tarayıcı penceresidir. İletişim kutusunda ne olursa olsun IdP'ye bağlıdır ve RP sayfasına kaynaktan bağımsız iletişim isteği göndermek için pencere tutamaçlarına erişilemez. Kullanıcı oturum açtıktan sonra IdP:
- Tarayıcıya kullanıcının oturum açtığını bildirmek için
Set-Login: logged-in
üstbilgisini gönderin veyanavigator.login.setStatus("logged-in")
API'sini çağırın. - İletişim kutusunu kapatmak için
IdentityProvider.close()
numaralı telefonu arayın.

Giriş Durumu API davranışını demo'muzda deneyebilirsiniz.
- IdP'ye gidin ve oturum açın düğmesine dokunun.
- İstediğiniz bir hesapla oturum açın.
- Hesap Durumu açılır listesinden Oturumun Süresi Doldu'yu seçin.
- Kişisel bilgileri güncelle düğmesine basın.
- FedCM'yi denemek için RP'yi ziyaret edin düğmesine dokunun.
Modül davranışı aracılığıyla kimlik sağlayıcıya girişi gözlemleyebilirsiniz.
Error API
Chrome, kimlik beyanı uç noktasına istek gönderdiğinde (örneğin, kullanıcı FedCM kullanıcı arayüzündeki Bu kimlikle devam et düğmesini tıkladığında veya otomatik yeniden kimlik doğrulama tetiklendiğinde) kimlik sağlayıcı, meşru nedenlerle jeton yayınlayamayabilir. Örneğin, istemci yetkisizse sunucu geçici olarak kullanılamıyordur. Şu anda Chrome, bu tür hatalar durumunda isteği sessizce reddeder ve yalnızca söz vermeyi reddederek RP'yi bilgilendirir.
Chrome, Error API ile IdP tarafından sağlanan hata bilgilerini içeren yerel bir kullanıcı arayüzü göstererek kullanıcıyı bilgilendirir.

IdP HTTP API
id_assertion_endpoint
yanıtında, kimlik sağlayıcı istek üzerine verilebiliyorsa tarayıcıya bir jeton döndürebilir. Bu öneride, jeton oluşturulamazsa kimlik sağlayıcı, iki yeni isteğe bağlı alan içeren bir "hata" yanıtı döndürebilir:
code
url
// id_assertion_endpoint response
{
"error": {
"code": "access_denied",
"url": "https://idp.example/error?type=access_denied"
}
}
IdP, kod için OAuth 2.0'da belirtilen hata listesinden [invalid_request
, unauthorized_client
, access_denied
, server_error
ve temporarily_unavailable
] bilinen hatalardan birini seçebilir veya herhangi bir dize kullanabilir. İkinci durumda Chrome, hata kullanıcı arayüzünü genel bir hata mesajıyla oluşturur ve kodu RP'ye iletir.
url
için, kullanıcılara hata hakkında ek bilgi sağlamak amacıyla hata hakkında bilgi içeren, kullanıcılar tarafından okunabilen bir web sayfasını tanımlar. Tarayıcılar yerel kullanıcı arayüzünde zengin hata mesajları sağlayamadığından bu alan kullanıcılar için faydalıdır. Örneğin, sonraki adımlara yönlendiren bağlantılar, müşteri hizmetleri iletişim bilgileri vb. Kullanıcı, hata ayrıntıları ve hatanın nasıl düzeltileceği hakkında daha fazla bilgi edinmek isterse tarayıcı kullanıcı arayüzünden sağlanan sayfayı ziyaret edebilir. URL, configURL
kimlik sağlayıcısıyla aynı sitede olmalıdır.
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;
}
Auto-Selected Flag API
mediation: optional
, Kimlik Bilgileri Yönetimi API'sindeki varsayılan kullanıcı uyumluluğu davranışıdır ve mümkün olduğunda otomatik yeniden kimlik doğrulamayı tetikler. Ancak otomatik yeniden kimlik doğrulama, yalnızca tarayıcının bildiği nedenlerle kullanılamıyor olabilir. Kullanılamaması durumunda kullanıcıdan farklı özelliklere sahip bir akış olan açık kullanıcı aracılığı ile oturum açması istenebilir.
- API arayanı, kimlik jetonu aldığında bunun otomatik yeniden kimlik doğrulama akışının bir sonucu olup olmadığı hakkında bilgi sahibi değildir. Bu da API performansını değerlendirmelerini ve kullanıcı deneyimini buna göre iyileştirmelerini zorlaştırır.
- Kimlik sağlayıcının bakış açısından, performans değerlendirmesi için otomatik yeniden kimlik doğrulamanın gerçekleşip gerçekleşmediğini de söyleyemez. Ayrıca, açık bir kullanıcı arabuluculuğunun olup olmadığı, güvenlikle ilgili daha fazla özelliği desteklemelerine yardımcı olabilir. Örneğin, bazı kullanıcılar kimlik doğrulama sırasında kullanıcının açıkça müdahale etmesini gerektiren daha yüksek bir güvenlik katmanını tercih edebilir. Bir kimlik sağlayıcı, bu tür bir arabuluculuk olmadan jeton isteği alırsa isteği farklı şekilde işleyebilir. Örneğin, RP'nin
mediation: required
ile FedCM API'yi tekrar çağırabilmesi için bir hata kodu döndürün.
Bu nedenle, otomatik yeniden kimlik doğrulama akışının görünürlüğü, geliştiricilere fayda sağlayacaktır.
Chrome, otomatik olarak seçilen işaret API'si ile otomatik yeniden kimlik doğrulama veya açık bir arabuluculuk gerçekleştiğinde Böyle devam et düğmesine dokunarak açık bir kullanıcı izninin alınıp alınmadığını hem kimlik sağlayıcıyla hem de RP ile paylaşır. Paylaşım yalnızca IdP/RP iletişimi için kullanıcı izni verildikten sonra gerçekleşir.
IdP paylaşımı
Kullanıcı iznini aldıktan sonra bilgileri IdP ile paylaşmak için Chrome, id_assertion_endpoint
adresine gönderilen POST
isteğine is_auto_selected=true
ekler:
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
Kısıtlanmış taraf paylaşımı
Tarayıcı, bilgileri isAutoSelected
'te RP ile IdentityCredential
üzerinden paylaşabilir:
const cred = await navigator.credentials.get({
identity: {
providers: [{
configURL: 'https://idp.example/manifest.json',
clientId: '1234'
}]
}
});
if (cred.isAutoSelected !== undefined) {
const isAutoSelected = cred.isAutoSelected;
}
Etkileşim kurma ve geri bildirim paylaşma
Test sırasında geri bildirimde bulunmak veya sorunla karşılaşmak isterseniz bunları crbug.com adresinde paylaşabilirsiniz.
Unsplash'taki Kırmızı şapkalı kız tarafından çekilen fotoğraf