Kimlik sağlayıcı tarafında FedCM ile kimlik çözümü uygulama

FedCM uygulaması, hem kimlik sağlayıcı (IdP) hem de güvenilir taraf (RP) için çeşitli temel adımlar içerir. FedCM'yi RP tarafında nasıl uygulayacağınızı öğrenmek için dokümanlara bakın.

IdPs, FedCM'yi uygulamak için aşağıdaki adımları tamamlamalıdır:

.well-known dosyası oluşturma

İzleyicilerin API'yi kötüye kullanmasını önlemek için IdP'nin eTLD+1'inin /.well-known/web-identity kısmından bir .well-known dosyası sunulmalıdır.

Bilinen dosya aşağıdaki özellikleri içerebilir:

Mülk Zorunlu Açıklama
provider_urls zorunlu IdP yapılandırma dosyası yollarının dizisi. accounts_endpoint ve login_url belirtilmişse yoksayılır (ancak yine de gereklidir).
accounts_endpoint önerilir, login_url
gerektirir
Hesaplar uç noktasının URL'si. Bu sayede, her yapılandırma dosyası aynı login_url ve accounts_endpoint URL'sini kullandığı sürece birden fazla yapılandırma desteklenebilir.

Not: Parametre, Chrome 132'den itibaren desteklenir.
login_url önerilir, accounts_endpoint gerektirir Kullanıcının IdP'de oturum açması için giriş sayfası URL'si. Her yapılandırma dosyası aynı login_url ve accounts_endpoint değerlerini kullandığı sürece birden fazla yapılandırma desteklenebilir.

Not: Bu parametre, Chrome 132 ve sonraki sürümlerde desteklenir.

Örneğin, IdP uç noktaları https://accounts.idp.example/ altında sunuluyorsa https://idp.example/.well-known/web-identity konumunda bir well-known dosyası ve bir IdP yapılandırma dosyası sunmaları gerekir. Aşağıda iyi bilinen dosya içeriği örneği verilmiştir:

  {
    "provider_urls": ["https://accounts.idp.example/config.json"]
  }

IdP'ler, well-known dosyasında accounts_endpoint ve login_url belirterek bir IdP için birden fazla yapılandırma dosyası barındırabilir. Bu özellik şu durumlarda faydalı olabilir:

  • Bir IdP'nin birden fazla farklı test ve üretim yapılandırmasını desteklemesi gerekir.
  • Bir IdP'nin bölgeye göre farklı yapılandırmaları (örneğin, eu-idp.example ve us-idp.example) desteklemesi gerekir.

Birden fazla yapılandırmayı desteklemek için (örneğin, test ve üretim ortamı arasında ayrım yapmak için) IdP, accounts_endpoint ve login_url değerlerini belirtmelidir:

  {
    // This property is required, but will be ignored when IdP supports
    // multiple configs (when `accounts_endpoint` and `login_url` are
    // specified), as long as `accounts_endpoint` and `login_url` in
    // that config file match those in the well-known file.
    "provider_urls": [ "https://idp.example/fedcm.json" ],

    // Specify accounts_endpoint and login_url properties to support
    // multiple config files.
    // Note: The accounts_endpoint and login_url must be identical
    // across all config files. Otherwise,
    // the configurations won't be supported.
    "accounts_endpoint": "https://idp.example/accounts",
    "login_url": "https://idp.example/login"
  }

IdP yapılandırma dosyası ve uç noktaları oluşturma

IdP yapılandırma dosyası, tarayıcı için gerekli uç noktaların listesini sağlar. IdP'ler bir veya daha fazla yapılandırma dosyası ile gerekli uç noktaları ve URL'leri barındırmalıdır. Tüm JSON yanıtları application/json içerik türüyle sunulmalıdır.

Yapılandırma dosyasının URL'si, navigator.credentials.get() çağrısına sağlanan değerlere göre belirlenir. RP, her kimlik sağlayıcı için yapılandırma dosyasının URL'sini iletir:

  // Executed on RP's side:
  try {
    const credential = await navigator.credentials.get({
      identity: {
        providers: [
          {
            // To allow users to sign in with the IdP1 using FedCM, RP specifies the IdP's config file URL:
            configUrl: 'https://idp1.example/foo.json', // first IdP
            clientId: '123',
          },
          // To allow users to sign in with the IdP2 using FedCM, RP specifies the IdP's config file URL.
          // Note that multiple IdPs in a single get() are supported from Chrome 136.
          {
            configUrl: 'https://idp2.example/bar.json', // second IdP
            clientId: '456',
          },
        ],
      },
    });

    const token = credential.token;
    // Get the current IdP's configURL to identify which provider the user is signed in with
    const currentIdpConfigUrl = credential.configURL;
    if (currentIdpConfigUrl === 'https://idp1.example/foo.json') {
      // handle the case where the user signed in with idp1
    } else if (currentIdpConfigUrl === 'https://idp2.example/bar.json') {
      // handle the case where the user signed in with idp2
    }
  } catch (error) {
    // handle error
  }

Tarayıcı, yapılandırma dosyasını Origin başlığı veya Referer başlığı olmadan GET isteğiyle getirir. İstek çerez içermiyor ve yönlendirmeleri takip etmiyor. Bu, IdP'nin isteği kimin gönderdiğini ve hangi RP'nin bağlanmaya çalıştığını öğrenmesini etkili bir şekilde engeller. Örneğin:

  GET /config.json HTTP/1.1
  Host: accounts.idp.example
  Accept: application/json
  Sec-Fetch-Dest: webidentity

IdP, bir JSON ile yanıt veren bir yapılandırma uç noktası uygulamalıdır. JSON aşağıdaki özellikleri içerir:

Mülk Açıklama
accounts_endpoint (zorunlu) Hesap uç noktasının URL'si.
account_label (isteğe bağlı) Bu yapılandırma dosyası kullanıldığında hangi hesapların döndürülmesi gerektiğini belirleyen özel hesap etiketi dizesi (örneğin: "account_label": "developer").
Bir IdP, özel hesap etiketlemeyi aşağıdaki şekilde uygulayabilir:

Örneğin, bir IdP, "account_label": "developer" belirtilmiş "https://idp.example/developer-config.json" yapılandırma dosyasını uygular. IdP, hesaplar uç noktasındaki label_hints parametresini kullanarak bazı hesapları "developer" etiketiyle de işaretler. Bir RP, "https://idp.example/developer-config.json" yapılandırma dosyası belirtilerek navigator.credentials.get() işlevini çağırdığında yalnızca "developer" etiketine sahip hesaplar döndürülür.

Not: Özel Hesap Etiketleri, Chrome 132'den itibaren desteklenir.
supports_use_other_account (isteğe bağlı) Kimlik sağlayıcı birden fazla hesabı destekliyorsa kullanıcının şu anda oturum açtığı hesaptan farklı bir hesapla oturum açıp açamayacağını belirten boole değeri. Bu yalnızca etkin mod için geçerlidir.
client_metadata_endpoint (isteğe bağlı) İstemci meta veri uç noktasının URL'si.
id_assertion_endpoint (zorunlu) Kimlik onaylama uç noktasının URL'si.
disconnect (isteğe bağlı) Bağlantıyı kesme uç noktasının URL'si.
login_url (zorunlu) Kullanıcının IdP'de oturum açması için giriş sayfası URL'si.
branding (isteğe bağlı) Çeşitli markalama seçeneklerini içeren nesne.
branding.background_color (isteğe bağlı) "Şu kullanıcı olarak devam et..." düğmesinin arka plan rengini ayarlayan markalama seçeneği. İlgili CSS söz dizimini kullanın. Örneğin: hex-color, hsl(), rgb() veya named-color.
branding.color (isteğe bağlı) "Şu kullanıcı olarak devam et" düğmesinin metin rengini ayarlayan markalama seçeneği. İlgili CSS söz dizimini kullanın. Örneğin: hex-color, hsl(), rgb() veya named-color.
branding.icons (isteğe bağlı) Simge nesneleri dizisi. Bu simgeler, oturum açma iletişim kutusunda gösterilir. Simge nesnesinin iki parametresi vardır:
  • url (zorunlu): Simge resminin URL'si. Bu özellik, SVG resimlerini desteklemez.
  • size (isteğe bağlı): Uygulama tarafından kare ve tek çözünürlüklü olduğu varsayılan simge boyutları. Bu sayı, pasif modda 25 pikselden, aktif modda ise 40 pikselden büyük veya bu değerlere eşit olmalıdır.

Kimlik sağlayıcıdan alınan örnek yanıt gövdesini aşağıda görebilirsiniz:

  {
    "accounts_endpoint": "/accounts.example",
    "client_metadata_endpoint": "/client_metadata.example",
    "id_assertion_endpoint": "/assertion.example",
    "disconnect_endpoint": "/disconnect.example",
    "login_url": "/login",
    // When RPs use this config file, only those accounts will be
    //returned that include `developer` label in the accounts endpoint.
    "account_label": "developer",
    "supports_use_other_account": true,
    "branding": {
      "background_color": "green",
      "color": "#FFEEAA",
      "icons": [{
        "url": "https://idp.example/icon.ico",
        "size": 25
      }]
    }
  }

Tarayıcı yapılandırma dosyasını getirdikten sonra IdP uç noktalarına sonraki istekleri gönderir:

IdP uç noktaları
IdP uç noktaları

Başka bir hesap kullanma

IdP, birden fazla hesabı veya mevcut hesabın değiştirilmesini destekliyorsa kullanıcılar, şu anda oturum açtıkları hesaptan farklı bir hesaba geçebilir.

Kullanıcının başka hesaplar seçebilmesi için IdP'nin bu özelliği yapılandırma dosyasında belirtmesi gerekir:

  {
    "accounts_endpoint" : "/accounts.example",
    "supports_use_other_account": true
  }

Hesaplar uç noktası

IdP'nin hesaplar uç noktası, kullanıcının IdP'de oturum açtığı hesapların listesini döndürür. IdP birden fazla hesabı destekliyorsa bu uç nokta, oturum açılmış tüm hesapları döndürür.

Tarayıcı, SameSite=None içeren çerezlerle GET isteği gönderir ancak client_id parametresi, Origin üstbilgisi veya Referer üstbilgisi olmadan gönderir. Bu, IdP'nin kullanıcının hangi RP'de oturum açmaya çalıştığını öğrenmesini etkili bir şekilde engeller. Örneğin:

  GET /accounts.example HTTP/1.1
  Host: accounts.idp.example
  Accept: application/json
  Cookie: 0x23223
  Sec-Fetch-Dest: webidentity

Sunucu, isteği aldıktan sonra şunları yapmalıdır:

  1. İsteğin bir Sec-Fetch-Dest: webidentity HTTP başlığı içerdiğini doğrulayın.
  2. Oturum çerezlerini, oturumu zaten açılmış olan hesapların kimlikleriyle eşleştirin.
  3. Hesap listesiyle yanıt verin.

Tarayıcı, aşağıdaki özelliklere sahip bir dizi hesap bilgisi içeren accounts özelliğini içeren bir JSON yanıtı bekler:

Mülk Açıklama
id (zorunlu) Kullanıcının benzersiz kimliği.
name Kullanıcının yerel ayarına ve tercihlerine göre tam adı.

Not: Chrome 141'den itibaren name, email, username veya tel parametrelerinden en az biri gereklidir. Daha önceki Chrome sürümlerinde hem name hem de email gereklidir.
username Kullanıcı tarafından seçilen kullanıcı adı.

Not: Chrome 141'den itibaren name, email, username veya tel parametrelerinden en az biri gereklidir.
email Kullanıcının e-posta adresi.

Not: Chrome 141'den itibaren name, email, username veya tel parametrelerinden en az biri gereklidir. Daha önceki Chrome sürümlerinde hem name hem de email gereklidir.
tel Kullanıcının telefon numarası.

Not: Chrome 141'den itibaren name, email, username veya tel parametrelerinden en az biri gereklidir.
picture (isteğe bağlı) Kullanıcı avatarı resminin URL'si.
given_name (isteğe bağlı) Kullanıcının adı.
approved_clients (isteğe bağlı) Kullanıcının kaydolduğu RP istemci kimliklerinin dizisi.
login_hints (isteğe bağlı) IdP'nin bir hesabı belirtmek için desteklediği tüm olası filtre türlerinin dizisi. RP, belirtilen hesabı seçerek göstermek için navigator.credentials.get() işlevini loginHint özelliğiyle birlikte çağırabilir.
domain_hints (isteğe bağlı) Hesabın ilişkili olduğu tüm alanların dizisi. RP, hesapları filtrelemek için domainHint özelliğiyle navigator.credentials.get() işlevini çağırabilir.
label_hints (isteğe bağlı) Bir hesabın ilişkili olduğu dize türünde özel hesap etiketleri dizisi.
Bir IdP, özel hesap etiketlemeyi aşağıdaki gibi uygulayabilir:
  • Hesap uç noktasında hesap etiketlerini belirtin (bu label_hints parametresini kullanarak).
  • Her bir etiket için yapılandırma dosyası oluşturun.

Örneğin, bir IdP, "account_label": "developer" belirtilmiş https://idp.example/developer-config.json yapılandırma dosyasını uygular. IdP, hesaplar uç noktasındaki label_hints parametresini kullanarak bazı hesapları "developer" etiketiyle de işaretler. Bir RP, navigator.credentials.get() işlevini https://idp.example/developer-config.json yapılandırma dosyası belirtilerek çağırdığında yalnızca "developer" etiketine sahip hesaplar döndürülür.

Özel hesap etiketleri, IdP sunucusu tarafından tamamen yönetilmesi ve RP'nin yalnızca kullanılacak yapılandırma dosyasını belirtmesi bakımından giriş ipucu ve alan adı ipucundan farklıdır.

Not: Özel Hesap Etiketleri, Chrome 132'den itibaren desteklenir.

Örnek yanıt gövdesi:

  {
    "accounts": [{
      "id": "1234",
      "given_name": "John",
      "name": "John Doe",
      "email": "john_doe@idp.example",
      "picture": "https://idp.example/profile/123",
      // Ids of those RPs where this account can be used
      "approved_clients": ["123", "456", "789"],
      // This account has 'login_hints`. When an RP calls `navigator.credentials.get()`
      // with a `loginHint` value specified, for example, `exampleHint`, only those
      // accounts will be shown to the user whose 'login_hints' array contains the `exampleHint`.
      "login_hints": ["demo1", "exampleHint"],
      // This account is labelled. IdP can implement a specific config file for a
      // label, for example, `https://idp.example/developer-config.json`. Like that
      // RPs can filter out accounts by calling `navigator.credentials.get()` with
      // `https://idp.example/developer-config.json` config file.
      "label_hints": ["enterprise", "developer"]
    }, {
      "id": "5678",
      "given_name": "Johnny",
      "name": "Johnny",
      "email": "johnny@idp.example",
      "picture": "https://idp.example/profile/456",
      "approved_clients": ["abc", "def", "ghi"],
      "login_hints": ["demo2"],
      "domain_hints": ["@domain.example"]
    }]
  }

Kullanıcı oturum açmamışsa HTTP 401 (Yetkisiz) ile yanıt verin.

Döndürülen hesaplar listesi tarayıcı tarafından kullanılır ve RP'ye sunulmaz.

Kimlik onaylama uç noktası

IdP'nin kimlik onaylama uç noktası, oturum açmış kullanıcısı için bir onaylama döndürür. Kullanıcı, navigator.credentials.get() call kullanarak bir RP web sitesinde oturum açtığında tarayıcı, SameSite=None ile çerezler içeren bir POST isteğini ve içerik türü application/x-www-form-urlencoded olan bir isteği aşağıdaki bilgilerle birlikte bu uç noktaya gönderir:

Mülk Açıklama
client_id (zorunlu) RP'nin istemci tanımlayıcısı.
account_id (zorunlu) Oturum açan kullanıcının benzersiz kimliği.
disclosure_text_shown Sonuç, Boole yerine "true" veya "false" dizesi olarak verilir. Bu durumlarda sonuç "false" olur:
  • RP'nin istemci kimliği, hesaplar uç noktasından gelen yanıttaki approved_clients mülk listesine dahil edildiği için açıklama metni gösterilmediyse.
  • Tarayıcı, geçmişte approved_clients olmadan bir kayıt anı gözlemlediği için açıklama metni gösterilmediyse.
  • fields parametresi üç alanın tamamını ("ad", "e-posta" ve "resim") içermiyorsa (ör. fields=[ ] veya fields=['name', 'picture']). Bu, eski uygulamalarla geriye dönük uyumluluk için gereklidir.

    Not: Chrome 141'den itibaren, disclosure_text_shown değeri "false" olsa bile açıklama metni gösterilebilir. Açıklama metninin gösterilip gösterilmediğini doğrulamak için bunun yerine disclosure_shown_for değerini kontrol edin.
disclosure_shown_for Tarayıcının, kullanıcının RP'den IdP'ye hangi verileri istediğini bildirmek için açıklama metninde kullanıcıya gösterdiği alanları listeler.
is_auto_selected RP'de otomatik yeniden kimlik doğrulama gerçekleştirilirse is_auto_selected, "true"'ü gösterir. Aksi takdirde "false". Bu, güvenlikle ilgili daha fazla özelliği desteklemek için yararlıdır. Örneğin, bazı kullanıcılar kimlik doğrulama sırasında açık kullanıcı aracılığı 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 isteği farklı şekilde işleyebilir. Örneğin, RP'nin FedCM API'yi mediation: required ile tekrar çağırabilmesi için bir hata kodu döndürün.
fields (isteğe bağlı) RP'nin IdP'den paylaşmasını istediği kullanıcı bilgilerini belirten dizeler dizisi. Aşağıdaki alanlar isteğe bağlı olarak belirtilebilir:
  • "name"
  • "username"
  • "email"
  • "tel"
  • "picture"
Tarayıcı, aşağıdaki örnekte gösterildiği gibi, POST isteğinde belirtilen alanları listeleyen fields, disclosure_text_shown ve disclosure_shown_for değerlerini gönderir.

Not: Fields API, Chrome 132 ve sonraki sürümlerde desteklenir. `"username"` ve `"tel"` alanları Chrome 141'den itibaren desteklenir.
params (isteğe bağlı) Ek özel anahtar/değer parametrelerinin belirtilmesine olanak tanıyan geçerli bir JSON nesnesi. Örneğin:
  • scope: RP'nin istemesi gereken ek izinleri içeren bir dize değeri (ör. "drive.readonly calendar.readonly")
  • nonce: Yanıtın bu belirli istek için verildiğinden emin olmak üzere RP tarafından sağlanan rastgele bir dize. Tekrar oynama saldırılarını önler.
  • Diğer özel anahtar/değer çifti parametreleri.
Tarayıcı bir POST isteği gönderdiğinde params değeri JSON'a serileştirilir ve ardından yüzde kodlaması uygulanır.

Not: Parameters API, Chrome 132 ve sonraki sürümlerde desteklenir.

Örnek HTTP üst bilgisi:

  POST /assertion.example HTTP/1.1
  Host: accounts.idp.example
  Origin: https://rp.example/
  Content-Type: application/x-www-form-urlencoded
  Cookie: 0x23223
  Sec-Fetch-Dest: webidentity

  // disclosure_text_shown is set to 'false', as the 'name' field value is missing in 'fields' array
  // params value is serialized to JSON and then percent-encoded.
  account_id=123&client_id=client1234&disclosure_text_shown=false&is_auto_selected=true&params=%22%7B%5C%22nonce%5C%22%3A%5C%22nonce-value%5C%22%7D%22.%0D%0A4&fields=email,picture&disclosure_shown_for=email,picture

Sunucu, isteği aldıktan sonra şunları yapmalıdır:

  1. İsteğe CORS (Merkezler 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 üstbilgisini, client_id tarafından belirlenen RP kaynağıyla eşleştirin. Eşleşmiyorlarsa reddedin.
  4. account_id değerini, oturumu zaten açılmış olan hesabın kimliğiyle eşleştirin. Eşleşmiyorlarsa reddedin.
  5. Jetonla yanıt verme İstek reddedilirse hata yanıtı ile yanıt verin.

IdP, jetonu nasıl vereceğine karar verebilir. Genel olarak, RP'nin jetonun gerçek olduğunu doğrulayabilmesi için hesap kimliği, istemci kimliği, veren kaynağı ve nonce gibi bilgilerle imzalanır.

Tarayıcı, aşağıdaki özelliği içeren bir JSON yanıtı bekler:

Mülk Açıklama
token Jeton, kimlik doğrulama hakkında talepler içeren bir dizedir.
continue_on Çok adımlı oturum açma akışını etkinleştiren yönlendirme URL'si.

Döndürülen jeton, kimlik doğrulamanın doğrulanabilmesi için tarayıcı tarafından RP'ye iletilir.

  {
    // IdP can respond with a token to authenticate the user
    "token": "***********"
  }

Özelliğe git

IdP, çok adımlı bir oturum açma akışını etkinleştirmek için kimlik onaylama uç noktası yanıtında bir yönlendirme URL'si sağlayabilir. Bu, IdP'nin ek bilgi veya izin istemesi gerektiğinde yararlıdır. Örneğin:

  • Kullanıcının sunucu tarafındaki kaynaklarına erişim izni.
  • İletişim bilgilerinin güncel olduğunun doğrulanması
  • Ebeveyn denetimleri'ne dokunun.

Kimlik onaylama uç noktası, kimlik onaylama uç noktasına mutlak veya göreli bir yol içeren bir continue_on özelliği döndürebilir.

  {
    // In the id_assertion_endpoint, instead of returning a typical
    // "token" response, the IdP decides that it needs the user to
    // continue on a popup window:
    "continue_on": "https://idp.example/continue_on_url"
  }

Yanıt continue_on parametresini içeriyorsa yeni bir pop-up pencere açılır ve kullanıcı belirtilen yola yönlendirilir. Kullanıcı continue_on sayfasıyla etkileşimde bulunduktan sonra, IdP'nin IdentityProvider.resolve() işlevini, orijinal navigator.credentials.get() çağrısından gelen sözün çözümlenebilmesi için jetonla birlikte bağımsız değişken olarak çağırması gerekir:

  document.getElementById('example-button').addEventListener('click', async () => {
    let accessToken = await fetch('/generate_access_token.cgi');
    // Closes the window and resolves the promise (that is still hanging
    // in the relying party's renderer) with the value that is passed.
    IdentityProvider.resolve(accessToken);
  });

Tarayıcı daha sonra pop-up'ı otomatik olarak kapatır ve jetonu API arayanına döndürür. Tek seferlik IdentityProvider.resolve() çağrısı, üst pencerenin (RP) ve pop-up penceresinin (IdP) iletişim kurmasının tek yoludur.
Kullanıcı isteği reddederse IdP, IdentityProvider.close() çağrısı yaparak pencereyi kapatabilir.

  IdentityProvider.close();

Devam Ettirme API'sinin çalışması için açık kullanıcı etkileşimi (tıklama) gerekir. Devamlılık API'sinin farklı aracılık modlarıyla işleyiş şekli:

  • passive modunda:
    • mediation: 'optional' (varsayılan): Continuation API yalnızca sayfadaki veya FedCM kullanıcı arayüzündeki bir düğmeyi tıklama gibi bir kullanıcı hareketiyle çalışır. Otomatik yeniden kimlik doğrulama, kullanıcı hareketi olmadan tetiklendiğinde pop-up penceresi açılmaz ve söz reddedilir.
    • mediation: 'required': Kullanıcıdan her zaman etkileşimde bulunmasını istediği için Continuation API her zaman çalışır.
  • Etkin modda:
    • Kullanıcı etkinleştirme her zaman gereklidir. Devam Ettirme API'si her zaman uyumludur.

Kullanıcı pop-up'ta hesabını değiştirmişse (örneğin, IdP "başka bir hesap kullan" işlevi sunuyorsa veya yetki verme durumlarında) resolve çağrısı, aşağıdakiler gibi bir şeye izin veren isteğe bağlı ikinci bir bağımsız değişken alır:

  IdentityProvider.resolve(token, {accountId: '1234');

Hata yanıtı döndürme

id_assertion_endpoint, iki isteğe bağlı alan içeren bir "hata" yanıtı da döndürebilir:

  • code: IdP, OAuth 2.0 belirtilen hata listesindeki (invalid_request, unauthorized_client, access_denied, server_error ve temporarily_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 iletir.
  • url: Kullanıcılara hata hakkında ek bilgi vermek için hata hakkında bilgi içeren, insanlar tarafından okunabilir bir web sayfasını tanımlar. Tarayıcılar yerleşik bir kullanıcı arayüzünde zengin hata mesajları sağlayamadığı için bu alan kullanıcılar açısından yararlıdır. Örneğin: sonraki adımlarla ilgili bağlantılar veya müşteri hizmetleri iletişim bilgileri. Bir 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ünden sağlanan sayfayı ziyaret edebilir. URL, IdP configURL ile aynı siteye ait olmalıdır.
  // id_assertion_endpoint response
  {
    "error" : {
      "code": "access_denied",
      "url" : "https://idp.example/error?type=access_denied"
    }
  }

Özel Hesap Etiketleri

Özel Hesap Etiketleri ile IdP, kullanıcı hesaplarını etiketlerle açıklama ekleyebilir ve RP, belirli bir etiket için configURL belirterek yalnızca belirli etiketlere sahip hesapları getirmeyi seçebilir. Bu özellik, bir RP'nin hesapları belirli ölçütlere göre filtrelemesi gerektiğinde (ör. yalnızca "developer" veya "hr" gibi role özgü hesapları göstermek için) yararlı olabilir.

navigator.credentials.get() çağrısında belirtilerek Domain Hint ve Login Hint özellikleri kullanılarak benzer filtreleme yapılabilir. Ancak özel hesap etiketleri, yapılandırma dosyasını belirterek kullanıcıları filtreleyebilir. Bu özellik, özellikle birden fazla configURL kullanıldığında yararlıdır. Özel hesap etiketleri, giriş veya alan ipuçları gibi RP'den değil, IdP sunucusundan sağlandığı için de farklıdır.

"developer" ve "hr" hesapları arasında ayrım yapmak isteyen bir IdP'yi ele alalım. Bunun için IdP'nin sırasıyla "developer" ve "hr" için iki yapılandırma URL'sini desteklemesi gerekir:

  • Geliştirici yapılandırma dosyası https://idp.example/developer/fedcm.json bir "developer" etiketine, kuruluş yapılandırma dosyası https://idp.example/hr/fedcm.json ise aşağıdaki gibi bir "hr" etiketine sahiptir:
  // The developer config file at `https://idp.example/developer/fedcm.json`
  {
    "accounts_endpoint": "https://idp.example/accounts",
    "client_metadata_endpoint": "/client_metadata",
    "login_url": "https://idp.example/login",
    "id_assertion_endpoint": "/assertion",
    "account_label": "developer"
  }
  // The hr config file at `https://idp.example/hr/fedcm.json`
  {
    "accounts_endpoint": "https://idp.example/accounts",
    "client_metadata_endpoint": "/client_metadata",
    "login_url": "https://idp.example/login",
    "id_assertion_endpoint": "/assertion",
    "account_label": "hr"
  }
  • Böyle bir kurulumda, birden fazla configURL'ye izin vermek için well-known dosyası accounts_endpoint ve login_url değerlerini içermelidir:
  {
    "provider_urls": [ "https://idp.example/fedcm.json" ],
    "accounts_endpoint": "https://idp.example/accounts",
    "login_url": "https://idp.example/login"
  }
  • Ortak IdP hesap uç noktası (bu örnekte https://idp.example/accounts), her hesap için bir dizide atanmış etiketlere sahip bir label_hints özelliği içeren hesapların listesini döndürür:
  {
  "accounts": [{
    "id": "123",
    "given_name": "John",
    "name": "John Doe",
    "email": "john_doe@idp.example",
    "picture": "https://idp.example/profile/123",
    "label_hints": ["developer"]
    }], [{
    "id": "4567",
    "given_name": "Jane",
    "name": "Jane Doe",
    "email": "jane_doe@idp.example",
    "picture": "https://idp.example/profile/4567",
    "label_hints": ["hr"]
    }]
  }

Bir RP, "hr" kullanıcılarının oturum açmasına izin vermek istediğinde navigator.credentials.get() çağrısında configURL'yi https://idp.example/hr/fedcm.json belirtebilir:

  let { token } = await navigator.credentials.get({
    identity: {
      providers: [{
        clientId: '1234',
        nonce: '234234',
        configURL: 'https://idp.example/hr/fedcm.json',
      },
    }
  });

Sonuç olarak, kullanıcının oturum açması için yalnızca 4567 hesabının kimliği kullanılabilir. 123 hesabının hesap kimliği, kullanıcının bu sitede IdP tarafından desteklenmeyen bir hesapla sağlanmaması için tarayıcı tarafından sessizce gizlenir.

Göz önünde bulundurulması gereken diğer noktalar:

  • Etiketler dizedir. label_hints dizisi veya account_label alanı dize olmayan bir değer kullanıyorsa bu değer yoksayılır.
  • configURL içinde etiket belirtilmemişse tüm hesaplar FedCM hesap seçicide gösterilir.
  • Bir hesap için etiket belirtilmemişse bu hesap yalnızca configURL için de etiket belirtilmemişse hesap seçicide gösterilir.
  • Pasif modda istenen etikete karşılık gelen bir hesap yoksa (Domain Hint özelliğine benzer şekilde) FedCM iletişim kutusunda bir giriş istemi gösterilir. Bu istem, kullanıcının bir IdP hesabında oturum açmasına olanak tanır. Etkin modda, giriş pop-up penceresi doğrudan açılır.

Uç noktanın bağlantısını kesme

Tarayıcı, IdentityCredential.disconnect() işlevini çağırarak SameSite=None çerezleri ve application/x-www-form-urlencoded içerik türüyle birlikte bu bağlantıyı kesme uç noktasına aşağıdaki bilgileri içeren bir kaynaklar arası POST isteği gönderir:

Mülk Açıklama
account_hint IdP hesabı için ipucu.
client_id RP'nin istemci tanımlayıcısı.
  POST /disconnect.example 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

Sunucu, isteği aldıktan sonra şunları yapmalıdır:

  1. İsteğe CORS (Merkezler 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 üstbilgisini, client_id tarafından belirlenen RP kaynağıyla eşleştirin. Eşleşmiyorlarsa reddedin.
  4. account_hint değerini, oturum açılmış hesapların kimlikleriyle eşleştirin.
  5. Kullanıcı hesabının RP ile bağlantısını kesin.
  6. Tarayıcıya, tanımlanan kullanıcı hesabı bilgilerini JSON biçiminde yanıtlayın.

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

  {
    "account_id": "account456"
  }

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

İstemci meta verileri uç noktası

IdP'nin istemci meta veri uç noktası, RP'nin gizlilik politikası, hizmet şartları ve logo simgeleri gibi güvenen tarafın meta verilerini döndürür. RP'ler, gizlilik politikalarının ve hizmet şartlarının bağlantılarını önceden IdP'ye sağlamalıdır. Bu bağlantılar, kullanıcı henüz IdP ile RP'ye kaydolmadığında oturum açma iletişim kutusunda gösterilir.

Tarayıcı, çerezler olmadan client_id navigator.credentials.get kullanarak bir GET isteği gönderir. Örneğin:

  GET /client_metadata.example?client_id=1234 HTTP/1.1
  Host: accounts.idp.example
  Origin: https://rp.example/
  Accept: application/json
  Sec-Fetch-Dest: webidentity

Sunucu, isteği aldıktan sonra şunları yapmalıdır:

  1. client_id için RP'yi belirleyin.
  2. Müşteri meta verileriyle yanıt verin.

İstemci meta verileri uç noktasının özellikleri şunlardır:

Mülk Açıklama
privacy_policy_url (isteğe bağlı) RP gizlilik politikası URL'si.
terms_of_service_url (isteğe bağlı) RP hizmet şartları URL'si.
icons (isteğe bağlı) [{ "url": "https://rp.example/rp-icon.ico", "size": 40}] gibi nesne dizisi

Tarayıcı, uç noktadan bir JSON yanıtı bekler:

  {
    "privacy_policy_url": "https://rp.example/privacy_policy.html",
    "terms_of_service_url": "https://rp.example/terms_of_service.html",
    "icons": [{
          "url": "https://rp.example/rp-icon.ico",
          "size": 40
      }]
  }

Tarayıcı, döndürülen istemci meta verilerini kullanır ve bu veriler RP tarafından kullanılamaz.

Giriş URL'si

Bu uç nokta, kullanıcının IdP'de oturum açmasına izin vermek için kullanılır.

Login Status API (Giriş Durumu API'si) ile IdP, kullanıcının giriş durumunu tarayıcıya bildirmelidir. Ancak, oturumun süresi dolduğunda olduğu gibi durum senkronize olmayabilir. Böyle bir senaryoda tarayıcı, idp yapılandırma dosyasının login_url ile belirtilen giriş sayfası URL'si üzerinden kullanıcının IdP'de oturum açmasına dinamik olarak izin verebilir.

FedCM iletişim kutusunda, aşağıdaki resimde gösterildiği gibi oturum açma önerisinde bulunan bir mesaj gösterilir.

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

Kullanıcı Devam düğmesini tıkladığında tarayıcı, IdP'nin giriş sayfası için bir pop-up pencere açar.

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

İletişim kutusu, birinci taraf çerezlerine sahip 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 pencere tutamaçları kullanılamaz. Kullanıcı oturum açtıktan sonra IdP şunları yapmalıdır:

  • Kullanıcının oturum açtığını tarayıcıya bildirmek için Set-Login: logged-in üstbilgisini gönderin veya navigator.login.setStatus("logged-in") API'sini çağırın.
  • İletişim kutusunu kapatmak için IdentityProvider.close() seçeneğini tıklayın.
Kullanıcı, FedCM'yi kullanarak IdP'de oturum açtıktan sonra RP'de oturum açar.

Tarayıcıyı kullanıcının giriş durumu hakkında bilgilendirme

Giriş Durumu API'si, özellikle bir IdP olmak üzere bir web sitesinin tarayıcıya kullanıcının IdP'deki giriş durumu hakkında bilgi verdiği bir mekanizmadır. Bu API ile tarayıcı, IdP'ye yapılan gereksiz istekleri azaltabilir ve olası zamanlama saldırılarını önleyebilir.

IdP'ler, kullanıcı IdP'de oturum açtığında veya kullanıcının tüm IdP hesaplarında oturumu kapatıldığında bir HTTP başlığı göndererek ya da bir JavaScript API'si çağırarak kullanıcının oturum açma durumunu tarayıcıya bildirebilir. Tarayıcı, her IdP (yapılandırma URL'siyle tanımlanır) için oturum açma durumunu temsil eden üç durumlu bir değişken tutar. Olası değerler şunlardır:

  • logged-in
  • logged-out
  • unknown (varsayılan)
Giriş durumu Açıklama
logged-in Kullanıcının giriş durumu logged-in olarak ayarlandığında, FedCM'yi çağıran RP, IdP'nin hesaplar uç noktasına istek gönderir ve FedCM iletişim kutusunda kullanıcının kullanabileceği hesapları gösterir.
logged-out Kullanıcının giriş durumu logged-out olduğunda, FedCM sessizce başarısız olur ve IdP'nin hesaplar uç noktasına istek gönderilmez.
unknown (varsayılan) unknown durumu, IdP oturum açma durumu API'sini kullanarak bir sinyal göndermeden önce ayarlanır. Durum unknown olduğunda tarayıcı, IdP'nin hesap uç noktasına bir istek gönderir ve hesap uç noktasından gelen yanıta göre durumu günceller.

Kullanıcının oturum açtığını belirtmek için IdP kaynağında üst düzey bir gezinme veya aynı siteye ait bir alt kaynak isteğinde Set-Login: logged-in HTTP başlığı gönderin:

  Set-Login: logged-in

Alternatif olarak, üst düzey bir gezinmede IdP kaynağındaki JavaScript yöntemini navigator.login.setStatus('logged-in') çağırın:

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

Kullanıcının giriş durumu logged-in olarak ayarlanır.

Kullanıcının tüm hesaplarından oturumunun kapatıldığını belirtmek için IdP kaynağında üst düzey bir gezinme veya aynı siteye ait bir alt kaynak isteğinde Set-Login: logged-out HTTP üstbilgisini gönderin:

  Set-Login: logged-out

Alternatif olarak, üst düzey gezinmede IdP kaynağındaki JavaScript API'yi navigator.login.setStatus('logged-out') çağırın:

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

Kullanıcının giriş durumu logged-out olarak ayarlanır.

unknown durumu, IdP oturum açma durumu API'sini kullanarak bir sinyal göndermeden önce ayarlanır. Tarayıcı, IdP'nin hesaplar uç noktasına bir istek gönderir ve hesaplar uç noktasından gelen yanıta göre durumu günceller:

  • 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ını başarısız yapın.

Kullanıcının dinamik bir giriş akışı üzerinden oturum açmasına izin verme

IdP, kullanıcının giriş durumunu tarayıcıya bildirmeye devam etse de oturumun süresi dolduğunda bu durum senkronize olmayabilir. Oturum açma durumu logged-in olduğunda tarayıcı, hesaplar uç noktasına kimlik bilgileri içeren bir istek göndermeye çalışır ancak oturum artık kullanılabilir olmadığından sunucu herhangi bir hesap döndürmez. Böyle bir senaryoda tarayıcı, kullanıcının pop-up pencere aracılığıyla IdP'de oturum açmasına dinamik olarak izin verebilir.

Sonraki adımlar

RP'leriniz için FedCM'yi uygulayın ve JavaScript SDK'sını dağıtın. Kendi kendine uygulama ihtiyacını ortadan kaldırarak RP'leri güncel tutun.
Ortamınızı nasıl ayarlayacağınızı ve uygulamanızda nasıl hata ayıklama yapacağınızı öğrenin.