Gizliliği korumaya yönelik kimlik federasyonu için FedCM'yi nasıl kullanacağınızı öğrenin.
FedCM (Birleştirilmiş Kimlik Bilgisi Yönetimi), kullanıcıların kişisel bilgilerini kimlik hizmeti veya siteyle paylaşmadan sitelere giriş yapabildiği, birleşik kimlik hizmetlerine (ör. "... ile oturum aç") yönelik gizliliği korumaya yönelik bir yaklaşımdır.
FedCM kullanım alanları, kullanıcı akışları ve API yol haritası hakkında daha fazla bilgi edinmek için FedCM API'ye giriş sayfasına göz atın.
FedCM geliştirme ortamı
FedCM'yi kullanmak için Chrome'da hem kimlik sağlayıcıda hem de RP'de güvenli bir bağlama (HTTPS veya localhost) ihtiyacınız vardır.
Android'de Chrome'da kod hata ayıklama
FedCM kodunuzdaki hataları ayıklamak için yerel olarak bir sunucu oluşturup çalıştırın. Bağlantı noktası yönlendirmeli USB kablosuyla bağlanmış bir Android cihazdan Chrome'da bu sunucuya erişebilirsiniz.
Android cihazlarda uzaktan hata ayıklama başlıklı makaledeki talimatları uygulayarak Android'de Chrome'da hata ayıklama için masaüstünde Geliştirici Araçları'nı kullanabilirsiniz.
Chrome'da üçüncü taraf çerezlerini engelleme
FedCM'nin, Chrome'da üçüncü taraf çerezleri olmadan nasıl çalıştığını gerçekten uygulanmadan önce test edebilirsiniz.
Üçüncü taraf çerezlerini engellemek için Gizli modu kullanın veya chrome://settings/cookies
adresindeki masaüstü ayarlarınızdan "Üçüncü taraf çerezlerini engelle"yi seçin ya da mobil cihazınızda Ayarlar > Site ayarları > Çerezler'e giderek bu seçeneği belirleyin.
FedCM API'sini kullanma
Hesap listesi, iddia yayınlama ve isteğe bağlı olarak istemci meta verileri için tanınmış bir dosya, yapılandırma dosyası ve uç noktalar oluşturarak FedCM ile entegrasyon gerçekleştirirsiniz.
FedCM, buradan RP'lerin IdP ile oturum açmak için kullanabileceği JavaScript API'lerini gösterir.
İyi bilinen bir dosya oluşturma
İzleyicilerin API'yi kötüye kullanmasını önlemek için IdP'nin /.well-known/web-identity
eTLD+1 kısmından iyi bilinen bir dosya sunulmalıdır.
Örneğin, IdP uç noktaları https://accounts.idp.example/
altında sunuluyorsa https://idp.example/.well-known/web-identity
adresinde iyi bilinen bir dosya ve IdP yapılandırma dosyası sunmaları gerekir. İyi bilinen bir dosya içeriği örneği:
{
"provider_urls": ["https://accounts.idp.example/config.json"]
}
JSON dosyası, RP'ler tarafından navigator.credentials.get
içinde configURL
'in bir yol parçası olarak belirtilebilecek IdP yapılandırma dosyası URL'leri dizisi içeren provider_urls
mülkünü içermelidir. Dizideki URL dizesi sayısı 1 ile sınırlıdır ancak bu sayı ileride geri bildiriminizle değişebilir.
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. Kimlik sağlayıcılar bu yapılandırma dosyasını ve gerekli uç noktaları ile URL'leri barındırır. Tüm JSON yanıtları application/json
içerik türüyle sunulmalıdır.
Yapılandırma dosyasının URL'si, bir RP'de yürütülen navigator.credentials.get
çağrısına sağlanan değerlere göre belirlenir.
const credential = await navigator.credentials.get({
identity: {
context: 'signup',
providers: [{
configURL: 'https://accounts.idp.example/config.json',
clientId: '********',
nonce: '******'
}]
}
});
const { token } = credential;
configURL
olarak IdP yapılandırma dosyası konumunun tam URL'sini belirtin. RP'de navigator.credentials.get()
çağrıldığında tarayıcı, Origin
veya Referer
başlığı olmadan GET
isteğiyle yapılandırma dosyasını getirir. İstek çerez içermiyor ve yönlendirmeleri takip etmiyor.
Bu, kimlik sağlayıcının isteği kimin yaptığını ve hangi RP'nin bağlantı kurmaya ç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
Tarayıcı, IdP'den aşağıdaki özellikleri içeren bir JSON yanıtı bekler:
Mülk | Açıklama |
---|---|
accounts_endpoint (zorunlu) |
Hesaplar uç noktasının URL'si. |
client_metadata_endpoint (isteğe bağlı) |
İstemci meta veri uç noktasının URL'si. |
id_assertion_endpoint (zorunlu) |
Kimlik onayı 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çacağı giriş sayfası URL'si. |
branding (isteğe bağlı) |
Çeşitli markalaşma seçeneklerini içeren nesne. |
branding.background_color (isteğe bağlı) |
"... olarak devam et" düğmesinin arka plan rengini ayarlayan markalaşma seçeneği. Alakalı CSS söz dizimini (hex-color , hsl() , rgb() veya named-color ) kullanın. |
branding.color (isteğe bağlı) |
"... olarak devam et" düğmesinin metin rengini ayarlayan markalaşma seçeneği. İlgili CSS söz dizimini (hex-color , hsl() , rgb() veya named-color ) kullanın. |
branding.icons (isteğe bağlı) |
Oturum açma iletişim kutusunda görüntülenen simge nesnesini ayarlayan markalaşma seçeneği. Simge nesnesi, iki parametreye sahip bir dizidir:
|
RP, önceden tanımlanmış kimlik doğrulama bağlamlarını karşılamak için navigator.credentials.get()
için identity.context
değeri aracılığıyla FedCM iletişim kutusu kullanıcı arayüzündeki dizeyi değiştirebilir. İsteğe bağlı özellik şunlardan biri olabilir: "signin"
(varsayılan), "signup"
, "use"
veya "continue"
.
IdP'den gelen örnek bir yanıt gövdesi:
{
"accounts_endpoint": "/accounts.php",
"client_metadata_endpoint": "/client_metadata.php",
"id_assertion_endpoint": "/assertion.php",
"disconnect_endpoint": "/disconnect.php",
"login_url": "/login",
"branding": {
"background_color": "green",
"color": "#FFEEAA",
"icons": [{
"url": "https://idp.example/icon.ico",
"size": 25
}]
}
}
Tarayıcı, yapılandırma dosyasını aldıktan sonra, sonraki istekleri IdP uç noktalarına gönderir:
Hesaplar uç noktası
IdP'nin hesap uç noktası, kullanıcının şu anda 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
ile çerez içeren bir 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.php HTTP/1.1
Host: accounts.idp.example
Accept: application/json
Cookie: 0x23223
Sec-Fetch-Dest: webidentity
İsteği aldıktan sonra sunucu şunları yapmalıdır:
- İsteğin bir
Sec-Fetch-Dest: webidentity
HTTP başlığı içerdiğini doğrulayın. - Oturum çerezlerini, oturum açmış hesapların kimlikleriyle eşleyin.
- Hesap listesini ekleyerek yanıt verin.
Tarayıcı, aşağıdaki özelliklere sahip bir dizi hesap bilgisine sahip bir accounts
mülkü içeren JSON yanıtı bekler:
Mülk | Açıklama |
---|---|
id (zorunlu) |
Kullanıcının benzersiz kimliği. |
name (zorunlu) |
Kullanıcının adı ve soyadı. |
email (zorunlu) |
Kullanıcının e-posta adresi. |
given_name (isteğe bağlı) |
Kullanıcıya verilen ad. |
picture (isteğe bağlı) |
Kullanıcı avatarı resminin URL'si. |
approved_clients (isteğe bağlı) |
Kullanıcının kaydolduğu bir RP istemci kimliği dizisi. |
login_hints (isteğe bağlı) |
IdP'nin bir hesabı belirtmek için desteklediği tüm filtre türlerinin dizisi. Kısıtlanmış taraf, belirtilen hesabı seçmeli olarak göstermek için loginHint mülküyle navigator.credentials.get() komutunu çağırabilir. |
domain_hints (isteğe bağlı) |
Hesabın ilişkili olduğu tüm alan adlarının bir dizisi. Kısıtlanmış taraf, hesapları filtrelemek için domainHint mülküyle navigator.credentials.get() komutunu çağırabilir. |
Ö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",
"approved_clients": ["123", "456", "789"],
"login_hints": ["demo1", "demo1@idp.example"]
}, {
"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", "demo2@idp.example"],
"domain_hints": ["corp.example"]
}]
}
Kullanıcı oturum açmadıysa HTTP 401 (Yetkisiz) ile yanıt verin.
Döndürülen hesap listesi tarayıcı tarafından kullanılır ve RP tarafından kullanılamaz.
İstemci meta verisi uç noktası
IdP'nin istemci meta veri uç noktası, bağlı tarafın meta verilerini (ör. RP'nin gizlilik politikası ve hizmet şartları) döndürür. RP'ler, gizlilik politikalarının ve hizmet şartlarının bağlantılarını IdP'ye önceden sağlamalıdır. Bu bağlantılar, kullanıcı henüz IdP ile Kısıtlanmış Taraf'a kaydolmadığında oturum açma iletişim kutusunda gösterilir.
Tarayıcı, çerez olmadan client_id
navigator.credentials.get
kullanarak bir GET
isteği gönderir. Örneğin:
GET /client_metadata.php?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:
client_id
için RP'yi belirleyin.- İstemci meta verilerini ekleyerek yanıt verin.
İstemci meta veri 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. |
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",
}
Döndürülen istemci meta verileri, tarayıcı tarafından kullanılır ve RP tarafından kullanılamaz.
Kimlik onayı uç noktası
Kimlik doğrulama sağlayıcının kimlik beyanı uç noktası, oturum açmış kullanıcısı için bir beyan döndürür.
Kullanıcı, navigator.credentials.get()
çağrısını kullanarak bir RP web sitesinde oturum açtığında tarayıcı, bu uç noktaya aşağıdaki bilgileri içeren bir POST
isteği gönderir: SameSite=None
çerezleri ve application/x-www-form-urlencoded
içerik türü.
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. |
nonce (isteğe bağlı) |
Kısıtlanmış taraf tarafından sağlanan tek seferlik istek. |
disclosure_text_shown |
Sonuçlar, "true" veya "false" dizesiyle (boole yerine) elde edilir. Açıklama metni gösterilmediyse sonuç "false" olur. Kısıtlanmış tarafın istemci kimliği, hesap uç noktasından gelen yanıtın approved_clients özellik listesine eklendiğinde veya tarayıcı geçmişte approved_clients yokken bir kayıt anı gözlemlediğinde bu durum gerçekleşir. |
is_auto_selected |
RP'de otomatik yeniden kimlik doğrulama gerçekleştirilirse is_auto_selected , "true" değerini gösterir. Diğer durumlarda "false" . Bu, güvenlikle ilgili daha fazla özelliğin desteklenmesine yardımcı olur. Örneğin, bazı kullanıcılar kimlik doğrulama sırasında kullanıcının açık şekilde müdahale etmesini gerektiren daha yüksek bir güvenlik katmanını tercih edebilir. Bir IdP, böyle bir uyumlulaştırma olmadan jeton isteği alırsa isteği farklı şekilde işleyebilir. Örneğin, kısıtlanmış tarafın FedCM API'yi mediation: required ile tekrar çağırabileceği bir hata kodu döndürün. |
Örnek HTTP üst bilgisi:
POST /assertion.php HTTP/1.1
Host: accounts.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=Ct60bD&disclosure_text_shown=true&is_auto_selected=true
Sunucu, isteği aldıktan sonra:
- İsteğe CORS (Kaynaklar 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
başlığını,client_id
tarafından belirlenen RP kaynağıyla eşleştirin. Eşleşmiyorlarsa reddedin.account_id
öğesini, halihazırda oturum açmış olan hesabın kimliğiyle eşleştirin. Eşleşmiyorlarsa reddedin.- Jeton kullanarak yanıt ver. İstek reddedilirse hata yanıtı ile yanıt verin.
Jetonun nasıl verileceği IdP'ye bağlıdır, ancak genellikle hesap kimliği, istemci kimliği, kartı verenin kaynağı, nonce
gibi bilgilerle imzalanır. Böylece, kısıtlanmış taraf, jetonun orijinal olduğunu doğrulayabilir.
Tarayıcı, aşağıdaki özelliği içeren bir JSON yanıtı bekler:
Mülk | Açıklama |
---|---|
token (zorunlu) |
Jeton, kimlik doğrulamayla ilgili hak taleplerini içeren bir dizedir. |
{
"token": "***********"
}
Döndürülen jeton, RP'nin kimlik doğrulamayı doğrulayabilmesi için tarayıcı tarafından RP'ye iletilir.
Hata yanıtı döndürme
id_assertion_endpoint
, iki isteğe bağlı alanı olan 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 sağlamak için hatayla ilgili bilgiler içeren, kullanıcıların okuyabileceği bir web sayfasını 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 için bağlantılar, müşteri hizmetleri iletişim bilgileri vb. Kullanıcılar 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"
}
}
Uç noktanın bağlantısını kesme
IdentityCredential.disconnect()
çağrıldığında tarayıcı, bu bağlantı kaldırma uç noktasına aşağıdaki bilgileri içeren SameSite=None
ve application/x-www-form-urlencoded
türünde içerik türü çerezleri içeren bir çapraz kaynak POST
isteği gönderir:
Mülk | Açıklama |
---|---|
account_hint |
IdP hesabıyla ilgili ipucu. |
client_id |
RP'nin istemci tanımlayıcısı. |
POST /disconnect.php 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:
- İsteğe CORS (Kaynaklar 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
başlığını,client_id
tarafından belirlenen RP kaynağıyla eşleştirin. Eşleşmezlerse reddedin.account_hint
öğesini, halihazırda oturum açmış durumdaki hesapların kimlikleriyle eşleştirin.- Kullanıcı hesabının RP ile bağlantısını kesin.
- Tanımlanmış kullanıcı hesabı bilgilerini JSON biçiminde kullanarak tarayıcıya yanıt verin.
Örnek bir yanıt JSON yükü şöyle 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.
Giriş URL'si
Giriş Durumu API'si ile IdP, kullanıcının giriş durumunu tarayıcıya bildirmelidir. Ancak durum, oturumun süresi dolduğunda senkronize olmayabilir. Böyle bir senaryoda tarayıcı, kullanıcının idp config dosyası login_url
ile belirtilen giriş sayfası URL'si üzerinden IdP'de dinamik bir şekilde oturum açmasına izin verebilir.
FedCM iletişim kutusunda, aşağıdaki resimde gösterildiği gibi oturum açmayı ö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 pop-up pencere açar.
İletişim kutusu, birinci taraf çerezlerine sahip 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.
Tarayıcıyı, kullanıcının kimlik sağlayıcıdaki giriş durumu hakkında bilgilendirin
Giriş Durumu API'si, bir web sitesinin (özellikle de kimlik sağlayıcının) tarayıcıya kullanıcının kimlik sağlayıcıdaki giriş durumunu bildirdiği bir mekanizmadır. Bu API ile tarayıcı, IdP'ye gönderilen gereksiz istekleri azaltabilir ve olası zamanlama saldırılarını hafifletebilir.
IdP'ler, bir HTTP üst bilgisi göndererek veya kullanıcı IdP'de oturum açtığında ya da kullanıcı tüm IdP hesaplarındaki oturumlarını 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 logged-in
, logged-out
ve unknown
olası değerleriyle giriş durumunu temsil eden üç durumlu bir değişken tutar. Varsayılan durum unknown
şeklindedir.
Kullanıcının oturum açtığını bildirmek için üst düzey gezinme bölümünde bir Set-Login: logged-in
HTTP üst bilgisi veya IdP kaynağında aynı site alt kaynak isteği gönderin:
Set-Login: logged-in
Alternatif olarak, üst düzey gezinme menüsündeki 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, RP çağrısı FedCM, IdP'nin hesap uç noktasına istek yapar ve kullanılabilir hesapları FedCM iletişim kutusunda kullanıcıya gösterir.
Kullanıcının tüm hesaplarında oturumunun kapatıldığını belirtmek için IdP kaynağında üst düzey bir gezinme veya aynı sitedeki alt kaynak isteğinde Set-Login:
logged-out
HTTP başlığını gönderin:
Set-Login: logged-out
Alternatif olarak, üst düzey gezinme menüsündeki IdP kaynağından JavaScript API'yi navigator.login.setStatus("logged-out")
çağırın:
navigator.login.setStatus("logged-out")
Bu aramalar, kullanıcının giriş durumunu logged-out
olarak kaydeder. Kullanıcının oturum açma durumu logged-out
olduğunda, FedCM çağrısı, kimlik sağlayıcının hesap uç noktasına istek göndermeden sessizce başarısız olur.
unknown
durumu, IdP Giriş Durumu API'sini kullanarak bir sinyal göndermeden önce ayarlanır. Bu API gönderildiğinde kullanıcı zaten IdP'de oturum açmış olabileceğinden daha iyi bir geçiş için Unknown
kullanıma sunuldu. IdP'nin, FedCM ilk kez çağrıldığında bunu tarayıcıya bildirme fırsatı olmayabilir. Bu durumda Chrome, IdP'nin hesap uç noktasına bir istek gönderir ve hesap 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 FedCM iletişim kutusunu açarak bu hesapları görüntüleyin. - 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ının dinamik bir giriş akışı üzerinden oturum açmasına izin verme
IdP, kullanıcının giriş durumunu tarayıcıya sürekli olarak bildirse de, oturumun süresinin sona ermesi gibi durumlarda senkronize olmayabilir. Giriş durumu logged-in
olduğunda tarayıcı, hesap 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. Bu gibi durumlarda tarayıcı, kullanıcının pop-up pencere aracılığıyla IdP'de dinamik olarak oturum açmasına izin verebilir.
Kimlik sağlayıcıyla güvenen tarafta oturum açma
IdP'nin yapılandırması ve uç noktaları kullanılabilir olduğunda, RP'ler kullanıcıların IdP ile Kısıtlanmış Taraf'ta oturum açmasına izin vermek için navigator.credentials.get()
numarasını arayabilir.
API'yi çağırmadan önce [FedCM'nin kullanıcının tarayıcısında kullanılabildiğini] onaylamanız gerekir. FedCM'nin kullanılıp kullanılamadığını kontrol etmek için bu kodu FedCM uygulamanızın etrafına sarın:
if ('IdentityCredential' in window) {
// If the feature is available, take action
}
Kullanıcıların RP'den kimlik sağlayıcıda oturum açmasına izin verilmesini istemek için aşağıdakileri yapın. Örneğin:
const credential = await navigator.credentials.get({
identity: {
providers: [{
configURL: 'https://accounts.idp.example/config.json',
clientId: '********',
nonce: '******'
}]
}
});
const { token } = credential;
providers
özelliği, aşağıdaki özelliklere sahip IdentityProvider
nesne dizisini alır:
Mülk | Açıklama |
---|---|
configURL (zorunlu) |
IdP yapılandırma dosyasının tam yolu. |
clientId (zorunlu) |
IdP tarafından verilen RP istemci tanımlayıcısı. |
nonce (isteğe bağlı) |
Yanıtın bu istek için gönderilmesini sağlamak amacıyla rastgele bir dize. Tekrarlanan saldırılarını engeller. |
loginHint (isteğe bağlı) |
Hesap uç noktaları tarafından sağlanan login_hints değerlerinden birini belirterek FedCM iletişim kutusu, belirtilen hesabı seçerek gösterir. |
domainHint (isteğe bağlı) |
Hesap uç noktaları tarafından sağlanan domain_hints değerlerinden birini belirterek FedCM iletişim kutusunda belirtilen hesabı seçerek gösterebilirsiniz. |
Tarayıcı, kayıt ve oturum açma kullanım alanlarını, hesap listesi uç noktasından gelen yanıtta approved_clients
varlığına bağlı olarak farklı şekilde ele alır. Kullanıcı Kısıtlanmış Taraf'a zaten kaydolmuşsa tarayıcı, "Şununla devam etmek için:..." ifadesini içeren bir açıklama metni göstermez.
Kaydolma durumu, aşağıdaki koşulların karşılanıp karşılanmadığına göre belirlenir:
approved_clients
, RP'ninclientId
değerini içeriyorsa.- Tarayıcı, kullanıcının Kısıtlanmış Taraf'a zaten kaydolduğunu hatırlarsa.
RP, navigator.credentials.get()
işlevini çağrdığında aşağıdaki etkinlikler gerçekleşir:
- Tarayıcı, istek gönderir ve çeşitli dokümanları getirir:
- Well-known dosyası ve uç noktaları açıklayan bir IdP yapılandırma dosyası.
- Hesaplar listesi.
- İsteğe bağlı: İstemci meta veri uç noktasından alınan RP'nin gizlilik politikası ve hizmet şartlarının URL'leri.
- Tarayıcı, kullanıcının oturum açmak için kullanabileceği hesapların listesini ve varsa hizmet şartlarını ve gizlilik politikasını gösterir.
- Kullanıcı oturum açmak için kullanılacak hesabı seçtiğinde, jeton almak üzere IdP'ye kimlik doğrulama uç noktasına yönelik bir istek gönderilir.
- RP, kullanıcının kimliğini doğrulamak için jetonu doğrulayabilir.
RP'lerin FedCM'yi desteklemeyen tarayıcıları desteklemesi beklenir. Bu nedenle, kullanıcılar FedCM dışındaki mevcut bir oturum açma işlemini kullanabilir. Üçüncü taraf çerezler tamamen kullanımdan kaldırılana kadar bu durum bir sorun yaratmayacaktır.
Jeton, RP sunucusu tarafından doğrulandıktan sonra, kısıtlanmış taraf kullanıcıyı kaydedebilir veya oturum açıp yeni bir oturum başlatmasına izin verebilir.
Login Hint API
Kullanıcı oturum açtıktan sonra, bazen bağlı taraf (RP) kullanıcıdan yeniden kimlik doğrulamasını ister. Ancak kullanıcı hangi hesabı kullandığından emin olmayabilir. RP, hangi hesapla oturum açılacağını belirtebilirse kullanıcının hesap seçmesi daha kolay olur.
Kısıtlanmış hesaplar, aşağıdaki kod örneğinde gösterildiği gibi, hesap listesi uç noktasından getirilen login_hints
değerlerden biriyle loginHint
mülküyle navigator.credentials.get()
yöntemini çağırarak belirli bir hesabı seçmeli olarak gösterebilir:
return await navigator.credentials.get({
identity: {
providers: [{
configURL: "https://idp.example/manifest.json",
clientId: "123",
nonce: nonce,
loginHint : "demo1@example.com"
}]
}
});
loginHint
ile eşleşen hesap olmadığında FedCM iletişim kutusunda bir giriş istemi gösterilir. Bu istem, kullanıcının RP tarafından istenen ipucu ile eşleşen bir IdP hesabına giriş yapmasına olanak tanır. Kullanıcı isteme dokunduğunda, yapılandırma dosyasında belirtilen giriş URL'sinin bulunduğu bir pop-up pencere açılır. Bağlantıya giriş ipucu ve alan ipucu sorgu parametreleri eklenir.
Domain Hint API
RP'nin, siteye yalnızca belirli bir alanla ilişkili hesapların giriş yapmasına izin verildiğini zaten bildiği durumlar vardır. Bu durum özellikle, erişilen sitenin kurumsal alanla kısıtlandığı kurumsal senaryolarda yaygındır. FedCM API, daha iyi bir kullanıcı deneyimi sunmak için RP'nin yalnızca RP'ye giriş yapmak için kullanılabilecek hesapları göstermesine olanak tanır. Bu, kullanıcının kurumsal alanın dışındaki bir hesap kullanarak RP'ye giriş yapmaya çalıştığı ancak doğru hesap türü kullanılmadığı için daha sonra bir hata mesajı (veya girişin işe yaramadığı durumlarda sessiz kalma) aldığı senaryoları önler.
RP'ler, aşağıdaki kod örneğinde gösterildiği gibi hesap listesi uç noktasından alınan domain_hints
değerlerinden biriyle domainHint
mülkü kullanarak navigator.credentials.get()
'ü çağırarak yalnızca eşleşen hesapları seçerek gösterebilir:
return await navigator.credentials.get({
identity: {
providers: [{
configURL: "https://idp.example/manifest.json",
clientId: "abc",
nonce: nonce,
domainHint : "corp.example"
}]
}
});
domainHint
ile eşleşen hesap olmadığında FedCM iletişim kutusunda bir giriş istemi gösterilir. Bu istem, kullanıcının RP tarafından istenen ipucu ile eşleşen bir IdP hesabına giriş yapmasına olanak tanır. Kullanıcı isteme dokunduğunda, yapılandırma dosyasında belirtilen giriş URL'sinin bulunduğu bir pop-up pencere açılır. Bu bağlantı, daha sonra giriş ipucu ve alan ipucu sorgu parametreleriyle eklenir.
Hata mesajı gösterme
Bazen kimlik sağlayıcı, meşru nedenlerle (ör. istemci yetkisiz olduğunda, sunucu geçici olarak kullanılamadığında) jeton yayınlayamayabilir. IdP "error" yanıtı döndürürse RP bunu yakalayabilir. Ayrıca Chrome, IdP tarafından sağlanan hata bilgilerini içeren bir tarayıcı kullanıcı arayüzü göstererek kullanıcıyı bilgilendirir.
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;
}
İlk kimlik doğrulamadan sonra kullanıcıların kimliğini otomatik olarak yeniden doğrulama
FedCM otomatik yeniden kimlik doğrulaması ("auto-reauthn" kısaca) kullanıcıların FedCM'yi kullanarak ilk kimlik doğrulamalarını yaptıktan sonra geri geldiklerinde otomatik olarak yeniden kimlik doğrulamasına olanak tanıyabilir. Buradaki "ilk kimlik doğrulama", kullanıcının FedCM'nin oturum açma iletişim kutusundaki "Şu şekilde devam et..." düğmesine aynı tarayıcı örneğinde ilk kez dokunarak bir hesap oluşturması veya RP'nin web sitesinde oturum açması anlamına gelir.
FedCM'nin ana hedeflerinden biri izlenmeyi önlemek için birleşik hesabı oluşturmadan önce açık kullanıcı deneyimi anlamlı olsa da, kullanıcı bir kez geçtikten sonra gereksiz şekilde kullanışsızdır: Kullanıcı RP ile IdP arasında iletişime izin verme izni verdikten sonra, daha önce kullanıcının onaylamış olduğu başka bir açık kullanıcı onayını zorunlu kılmanın gizlilik veya güvenlik açısından bir faydası olmaz.
Otomatik yeniden kimlik doğrulama ile tarayıcı, navigator.credentials.get()
çağrısında mediation
için belirttiğiniz seçeneğe bağlı olarak davranışını değiştirir.
const cred = await navigator.credentials.get({
identity: {
providers: [{
configURL: "https://idp.example/fedcm.json",
clientId: "1234",
}],
},
mediation: 'optional', // this is the default
});
// `isAutoSelected` is `true` if auto-reauthn was performed.
const isAutoSelected = cred.isAutoSelected;
mediation
, Kimlik Bilgisi Yönetimi API'sinde yer alan bir özelliktir, PasswordCredential ve FederatedCredential'ta olduğu gibi aynı şekilde davranır ve PublicKeyCredential tarafından da kısmen desteklenir. Mülk, aşağıdaki dört değeri kabul eder:
'optional'
(varsayılan): Mümkünse otomatik yeniden kimlik doğrulama, değilse uyumlulaştırma gerektirir. Oturum açma sayfasında bu seçeneği belirlemenizi öneririz.'required'
: Devam etmek için her zaman uyumlulaştırma gerektirir (ör. kullanıcı arayüzünde "Devam" düğmesini tıklamak). Kullanıcılarınızın kimlik doğrulamanın gerektiği her seferinde açıkça izin vermesi gerekiyorsa bu seçeneği belirleyin.'silent'
: Mümkünse otomatik olarak yeniden kimlik doğrulama, yoksa uyumlulaştırma gerekmeden sessizce başarısız olur. Özel oturum açma sayfası dışındaki ancak kullanıcıların oturumunu açık tutmak istediğiniz sayfalarda (ör. bir kargo web sitesindeki ürün sayfası veya bir haber web sitesindeki makale sayfası) bu seçeneği tercih etmenizi öneririz.'conditional'
: WebAuthn için kullanılır ve şu anda FedCM için kullanılamaz.
Bu çağrıyla, otomatik yeniden yetkilendirme aşağıdaki koşullarda gerçekleşir:
- FedCM kullanılabilir. Örneğin, kullanıcı FedCM'yi genel olarak veya ayarlarda RP için devre dışı bırakmamıştır.
- Kullanıcı, bu tarayıcıda web sitesinde oturum açmak için FedCM API ile yalnızca bir hesap kullandı.
- Kullanıcı, IdP'de bu hesapla oturum açmıştır.
- Otomatik yeniden yetkilendirme son 10 dakika içinde gerçekleşmedi.
- RP, önceki oturum açmadan sonra
navigator.credentials.preventSilentAccess()
çağrısı yapmadı.
Bu koşullar karşılandığında, FedCM navigator.credentials.get()
çağrıldığı anda kullanıcının kimliğini otomatik olarak yeniden doğrulama girişimi başlar.
Otomatik yeniden kimlik doğrulama, mediation: optional
olduğunda yalnızca tarayıcının bildiği nedenlerle kullanılamayabilir. Kısıtlanmış taraf, isAutoSelected
özelliğini inceleyerek otomatik yeniden kimlik doğrulamanın yapılıp yapılmadığını kontrol edebilir.
Bu, API performansını değerlendirmek ve kullanıcı deneyimini buna göre iyileştirmek için yararlıdır.
Ayrıca, bu özellik kullanılamadığında kullanıcıdan mediation: required
ile bir akış olan açık kullanıcı uyumlulaştırmasıyla oturum açması istenebilir.
preventSilentAccess()
ile uyumlulaştırmayı zorunlu kılma
Kullanıcıların oturumunu kapattıktan hemen sonra otomatik olarak kimlik doğrulamasını yapmak çok iyi bir kullanıcı deneyimi sunmaz. Bu nedenle FedCM, bu davranışı önlemek için otomatik yeniden yetkilendirmeden sonra 10 dakikalık bir bekleme süresi uygular. Bu, kullanıcı 10 dakika içinde tekrar oturum açmadığı sürece otomatik yeniden kimlik doğrulamanın en fazla 10 dakikada bir gerçekleşeceği anlamına gelir. RP, kullanıcı RP'den açıkça çıkış yaptığında (ör. çıkış düğmesini tıklayarak) tarayıcıdan otomatik yeniden kimlik doğrulamayı devre dışı bırakmasını açıkça istemek için navigator.credentials.preventSilentAccess()
işlevini çağırmalıdır.
function signout() {
navigator.credentials.preventSilentAccess();
location.href = '/signout';
}
Kullanıcılar, otomatik yeniden yetkilendirmeyi ayarlardan devre dışı bırakabilir.
Kullanıcılar, ayarlar menüsünden otomatik yeniden kimlik doğrulamayı devre dışı bırakabilir:
- Masaüstünde Chrome'da
chrome://password-manager/settings
> Oturumu otomatik olarak aç'a gidin. - Android Chrome'da Ayarlar > Şifre Yöneticisi'ni açın > Sağ üst köşedeki dişli simgesine dokunun > Otomatik oturum açma'yı seçin.
Kullanıcı, açma/kapatma düğmesini devre dışı bırakarak otomatik yeniden kimlik doğrulama davranışını tamamen devre dışı bırakabilir. Kullanıcı Chrome örneğinde bir Google Hesabı'nda oturum açtıysa ve senkronizasyon etkinse bu ayar cihazlar arasında depolanır ve senkronize edilir.
IdP'nin Kısıtlanmış Taraf ile bağlantısını kesme
Bir kullanıcı daha önce FedCM aracılığıyla IdP'yi kullanarak Kısıtlanmış Taraf'ta oturum açmışsa 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. IdP'nin bağlantısının kaldırılması için RP'nin bir configURL
, IdP altında kullandığı clientId
ve accountHint
geçirmesi 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 Kısıtlanmış Taraf'ta oturum açmamıştır.
- API, FedCM izin politikası olmadan bir iFrame içinden çağrılıyor.
- configURL geçersiz veya bağlantı kesme uç noktası yok.
- İç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ış.
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 hesapların kimliği, bağlantı kesilen uç noktasından gelen yanıtta belirtilir.
FedCM'yi kaynaklar arası bir iFrame'den çağırma
Üst çerçeve izin veriyorsa FedCM, identity-credentials-get
izin politikası kullanılarak kaynaklar arası iframe içinden çağrılabilir. Bunu yapmak için allow="identity-credentials-get"
özelliğini iframe etiketine aşağıdaki gibi ekleyin:
<iframe src="https://fedcm-cross-origin-iframe.glitch.me" allow="identity-credentials-get"></iframe>
Bu yöntemin işleyişini örnekte görebilirsiniz.
İsteğe bağlı olarak, üst çerçeve, kaynakları FedCM'yi çağırmak üzere kısıtlamak istiyorsa izin verilen kaynakların listesini içeren bir Permissions-Policy
başlığı gönderin.
Permissions-Policy: identity-credentials-get=(self "https://fedcm-cross-origin-iframe.glitch.me")
İzin Politikası'nın işleyiş şekli hakkında daha fazla bilgiyi İzin Politikası ile tarayıcı özelliklerini kontrol etme başlıklı makalede bulabilirsiniz.