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şturun.
- Yapılandırma dosyası oluşturun.
- Aşağıdaki uç noktaları oluşturun:
- Hesap uç noktası
- Kimlik onaylama uç noktası
- [isteğe bağlı] Uç noktanın bağlantısını kes
- [isteğe bağlı] İstemci meta verileri uç noktası
- Giriş uç noktası
- Tarayıcıyı kullanıcı oturum açma durumu hakkında bilgilendirin.
.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
veus-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:
|
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:

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:
- İsteğin bir
Sec-Fetch-Dest: webidentity
HTTP başlığı içerdiğini doğrulayın. - Oturum çerezlerini, oturumu zaten açılmış olan hesapların kimlikleriyle eşleştirin.
- 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:
Ö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:
|
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:
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:
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¶ms=%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:
- İsteğe CORS (Merkezler 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
üstbilgisini,client_id
tarafından belirlenen RP kaynağıyla eşleştirin. Eşleşmiyorlarsa reddedin.account_id
değerini, oturumu zaten açılmış olan hesabın kimliğiyle eşleştirin. Eşleşmiyorlarsa reddedin.- 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
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 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, IdPconfigURL
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
velogin_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 birlabel_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 veyaaccount_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:
- İsteğe CORS (Merkezler 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
üstbilgisini,client_id
tarafından belirlenen RP kaynağıyla eşleştirin. Eşleşmiyorlarsa reddedin.account_hint
değerini, oturum açılmış hesapların kimlikleriyle eşleştirin.- Kullanıcı hesabının RP ile bağlantısını kesin.
- 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:
client_id
için RP'yi belirleyin.- 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.

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

İ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 veyanavigator.login.setStatus("logged-in")
API'sini çağırın. - İletişim kutusunu kapatmak için
IdentityProvider.close()
seçeneğini tıklayın.
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.