FedCM güncellemeleri: Giriş Durumu API'si, Hata API'si ve Otomatik Olarak Seçili İşaretleme API'si

Chrome 120, FedCM için login Status API'yi gönderiyor. Giriş Durumu API'si (eski adıyla IdP Oturum Açma Durumu API'si), özellikle kimlik sağlayıcılarının kullanıcıları giriş yaparken veya çıkış yaparken web sitelerinin, özellikle de kimlik sağlayıcılarının tarayıcıya sinyal vermesini sağlar. FedCM bu sinyal, zamanlamayla ilgili sessiz bir saldırı sorununu ele almak için kullanılır ve bu sayede FedCM'nin üçüncü taraf çerezleri olmadan tamamen çalışmasını sağlar. Bu güncellemede, çalışma kapsamımızın bir parçası olarak daha önce orijinal FedCM'nin Gönderme Amacı bölümünde tanımladığımız, geriye dönük uyumsuz olan son değişiklikler ele alınmaktadır.

Giriş Durumu API'si gizlilik mülkünü ve kullanılabilirliği iyileştirse de gönderildikten sonra geriye dönük olarak uyumsuz bir değişiklik olarak kabul edilir. Mevcut bir FedCM uygulamanız varsa, aşağıdaki talimatları uygulayarak bu uygulamayı güncellediğinizden emin olun.

Ayrıca Chrome, iki yeni Federated Credential Management (FedCM) özelliği de sunar:

  • Error API: Oturum açma denemeleri başarısız olduğunda, varsa kimlik onayı uç noktasından gelen sunucu yanıtına göre yerel bir kullanıcı arayüzü ile kullanıcılara bildirim gönderin.
  • Auto-Selected Flag API: Bir kimlik bilgisi akışta otomatik olarak seçilmişse kimlik sağlayıcıyı (IdP) ve bağlı tarafı (RP) bilgilendirin.

Giriş Durumu API'sı

Giriş Durumu API'si, bir web sitesinin (özellikle de IdP) tarayıcıya IdP'deki giriş durumunu bildirdiği bir mekanizmadır. Bu API sayesinde tarayıcı, IdP'ye gönderilen gereksiz istekleri ve olası zamanlama saldırılarını azaltabilir.

Tarayıcıya kullanıcının giriş durumu hakkında bilgi verir

IdP'ler, bir HTTP üstbilgisi göndererek veya kullanıcı IdP'de oturum açtığında ya da tüm IdP hesaplarında oturumu kapattığında bir JavaScript API ç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 giriş durumunu olası değerlerle logged-in, logged-out ve unknown ile temsil eden bir üç durumlu değişken tutar. Varsayılan durum unknown şeklindedir.

Kullanıcının oturum açtığına dair sinyal vermek için üst düzey gezinme menüsünde veya aynı kaynak alt kaynak isteğinde Set-Login: logged-in HTTP üst bilgisi gönderin:

Set-Login: logged-in

Alternatif olarak, IdP kaynağından JavaScript API'yi navigator.login.setStatus('logged-in') çağırın:

navigator.login.setStatus('logged-in');

Bu aramalar, kullanıcının giriş durumunu logged-in olarak kaydeder. Kullanıcının giriş durumu logged-in olarak ayarlandığında, FedCM'yi çağıran RP, IdP'nin hesap listesi uç noktasına istek gönderir ve mevcut hesapları FedCM iletişim kutusunda kullanıcıya gösterir.

Kullanıcının tüm hesaplarındaki oturumunun kapatıldığını belirtmek için üst düzey gezinme menüsünde veya aynı kaynak alt kaynak isteğinde Set-Login: logged-out HTTP üst bilgisi gönderin:

Set-Login: logged-out

Alternatif olarak, IdP kaynağından navigator.login.setStatus('logged-out') JavaScript API'sini çağırın:

navigator.login.setStatus('logged-out');

Bu aramalar, kullanıcının giriş durumunu logged-out olarak kaydeder. Kullanıcının giriş durumu logged-out olduğunda, FedCM'nin çağrılması, IdP'nin hesap listesi uç noktasına istek yapılmadan sessizce başarısız olur.

unknown durumu, IdP, Giriş Durumu API'sini kullanarak sinyal göndermeden önce ayarlanır. Bu API'yi gönderdiğimizde kullanıcı zaten IdP'de oturum açmış olabileceğinden daha iyi bir geçiş için bu durumu kullanıma sunduk. IdP'nin, FedCM ilk çağrıldığı zamana kadar bunu tarayıcıya bildirme fırsatı olmayabilir. Bu durumda, IdP'nin 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.
  • Uç nokta, hesap döndürmezse durumu logged-out olarak güncelleyin ve FedCM çağrısı başarısız olur.

Kullanıcı oturumunun süresi dolarsa ne olur? Kullanıcının dinamik giriş akışıyla oturum açmasına izin verin!

IdP, kullanıcının giriş durumunu tarayıcıya bildirmeye devam etse de, durum senkronize olmayabilir (örneğin, oturumun süresinin dolması) olabilir. Giriş durumu logged-in olduğunda tarayıcı, hesap listesi uç noktasına kimlik bilgileri 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 penceresi aracılığıyla IdP'de oturum açmasına dinamik olarak izin verebilir.

FedCM iletişim kutusunda, aşağıdaki resimde gösterildiği gibi oturum açmayı öneren bir mesaj görüntülenir.

IdP'de oturum açmanızı öneren bir FedCM iletişim kutusu.
IdP'de oturum açmanızı öneren bir FedCM iletişim kutusu.

Kullanıcı Devam düğmesini tıkladığında, tarayıcı IdP'nin giriş sayfası için bir iletişim kutusu açar.

Örnek iletişim kutusu.
IdP'de oturum açma düğmesi tıklandıktan sonra gösterilen örnek iletişim kutusu.

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 çerezlerinin bulunduğu normal bir tarayıcı penceresidir. İletişim kutusunda olan her şey IdP'ye bağlıdır ve RP sayfasına kaynaklar arası iletişim isteği göndermek için hiçbir pencere tanıtıcısı yoktur. Kullanıcı oturum açtıktan sonra IdP şunları yapmalıdır:

  • Tarayıcıya kullanıcının oturum açtığını bildirmek için Set-Login: logged-in üst bilgisini gönderin veya navigator.login.setStatus("logged-in") API'yi çağırın.
  • İletişim kutusunu kapatmak için IdentityProvider.close() numaralı telefonu arayın.
Kullanıcı, FedCM'yi kullanarak IdP'de oturum açtıktan sonra bir RP'de oturum açar.
Bir kullanıcı, FedCM'yi kullanarak IdP'de oturum açtıktan sonra RP'de oturum açar.

Giriş Durumu API davranışını demomuzda deneyebilirsiniz.

  1. IdP'ye gidin ve oturum açın düğmesine dokunun.
  2. Rastgele bir hesapla oturum açın.
  3. Hesap Durumu açılır menüsünden Oturumun Süresi Doldu'yu seçin.
  4. Kişisel bilgileri güncelle düğmesine basın.
  5. FedCM'yi denemek için kısıtlanmış tarafları ziyaret edin düğmesine dokunun.

Modül davranışı üzerinden IdP'ye yapılan girişi gözlemleyebiliyor olmanız gerekir.

Hata API'sı

Chrome, kimlik doğrulama uç noktasına istek gönderdiğinde (örneğin, bir kullanıcı FedCM kullanıcı arayüzündeki Farklı devam et düğmesini tıkladığında veya otomatik yeniden kimlik doğrulama tetiklendiğinde) IdP geçerli nedenlerle jeton gönderemeyebilir. Örneğin, istemci yetkilendirilmemişse sunucu geçici olarak kullanılamaz durumdadır. Şu anda Chrome bu tür hatalarda isteği sessizce yerine getirmez ve yalnızca sözü reddetme yoluyla RP'ye bildirimde bulunur.

Error API ile Chrome, yerel bir kullanıcı arayüzünde IdP'nin sağladığı hata bilgilerini göstererek kullanıcıyı bilgilendirir.

Kullanıcının oturum açma denemesi başarısız olduktan sonra gösterilen hata mesajını gösteren FedCM iletişim kutusu. Dize, hata türüyle ilişkilendirilmiş.
Kullanıcının oturum açma girişimi başarısız olduktan sonra hata mesajını gösteren bir FedCM iletişim kutusu. Dize, hata türüyle ilişkilendirilir.

IdP HTTP API'si

id_assertion_endpoint yanıtında, istek üzerine verilebilecek bir jeton varsa IdP tarayıcıya bir jeton döndürebilir. Bu teklifte, jetonun gönderilemediği durumlarda IdP, iki yeni isteğe bağlı alan içeren bir "hata" yanıtı döndürebilir:

  1. code
  2. url
// id_assertion_endpoint response
{
  "error": {
     "code": "access_denied",
     "url": "https://idp.example/error?type=access_denied"
  }
}

Kod için IdP, OAuth 2.0 tarafından belirtilen hata listesinden [invalid_request, unauthorized_client, access_denied, server_error vetemporarily_unavailable] bilinen hatalardan birini seçebilir veya rastgele bir dize kullanabilir. İkinci durumda Chrome, hata kullanıcı arayüzünü genel bir hata mesajıyla oluşturur ve kodu RP'ye aktarır.

url için kullanıcılara hatayla ilgili ek bilgi sağlamak amacıyla okunabilir bir web sayfası tanımlar. Tarayıcılar, yerel bir kullanıcı arayüzünde zengin hata mesajları sağlayamadığından bu alan kullanıcılar için yararlıdır. Örneğin, sonraki adımların 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 daha fazla ayrıntı için tarayıcı kullanıcı arayüzünde sağlanan sayfayı ziyaret edebilir. URL, IdP configURL ile aynı siteye ait 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;
}

Otomatik Olarak Seçili İşaretleme API'sı

mediation: optional, Credential Management API'deki varsayılan kullanıcı uyumlulaştırma davranışıdır ve mümkün olduğunda otomatik yeniden kimlik doğrulamayı tetikler. Bununla birlikte, otomatik yeniden kimlik doğrulama yalnızca tarayıcının bildiği nedenlerden dolayı kullanılamayabilir. Bu mümkün olmadığında kullanıcıdan açık kullanıcı uyumlulaştırmasıyla oturum açması istenebilir. Bu, farklı özelliklere sahip bir akıştır.

  • API arayanları açısından kimlik jetonu aldıklarında bunun otomatik yeniden kimlik doğrulama akışından mı kaynaklandığını göremezler. Bu da API performansını değerlendirmelerini ve kullanıcı deneyimini buna göre iyileştirmelerini zorlaştırıyor.
  • IdP açısından bakıldığında, performans değerlendirmesi için otomatik kimlik doğrulamanın gerçekleşip gerçekleşmediğini eşit derecede ayırt edemez. Ayrıca, açık bir kullanıcı uyumlulaştırmasının projeye dahil olup olmaması, kullanıcının güvenlikle ilgili daha fazla özelliği desteklemesine yardımcı olabilir. Örneğin, bazı kullanıcılar kimlik doğrulamada açık kullanıcı uyumlulaştırma gerektiren daha yüksek bir güvenlik katmanını tercih edebilir. Bir IdP, bu tür bir uyumlulaştırma olmadan jeton isteği alırsa bu isteği farklı bir şekilde işleyebilir. Örneğin, RP'nin mediation: required ile FedCM API'yi tekrar çağırabileceği bir hata kodu döndürün.

Bu nedenle, otomatik yeniden kimlik doğrulama akışının görünürlüğünü sağlamak geliştiriciler için faydalı olur.

Otomatik olarak seçilen Flag API ile Chrome, otomatik yeniden kimlik doğrulama gerçekleştiğinde veya açık bir uyumlulaştırma gerçekleştiğinde Farklı devam et düğmesine dokunarak açık bir kullanıcı izni alınıp alınmadığını hem IdP 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ı

Chrome, bilgileri kullanıcı sonrası IdP'de paylaşmak için id_assertion_endpoint öğesine gönderilen POST isteğine is_auto_selected=true ifadesini 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 IdentityCredential üzerinden isAutoSelected bölgesindeki RP ile 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şimde bulunun ve geri bildirim paylaşın

Geri bildirimde bulunmak isterseniz veya test sırasında herhangi bir sorunla karşılaşırsanız bunları crbug.com adresinde paylaşabilirsiniz.

Fotoğraf: Unsplash'te Kırmızı şapkalı kız