Burada açıklanan güncellemelerin bazıları Güvenli ve Sorunsuz Oturum Açma: Kullanıcıların İlgisini Koruma başlıklı Google I/O oturumunda açıklanmıştır:
Chrome 57
Credential Management API'deki bu önemli değişiklik Chrome 57'de kullanıma sunulmuştur.
Kimlik bilgileri farklı bir alt alan adından paylaşılabilir
Chrome artık Credential Management API'yi kullanarak farklı bir alt alanda depolanan kimlik bilgilerini alabilir.
Örneğin, bir şifre login.example.com
içinde depolanıyorsa www.example.com
sitesindeki bir komut dosyası bu şifreyi hesap seçici iletişim kutusundaki hesap öğelerinden biri olarak gösterebilir.
Şifreyi navigator.credentials.store()
kullanarak açık bir şekilde depolamanız gerekir. Böylece bir kullanıcı iletişim kutusuna dokunarak kimlik bilgisi seçtiğinde şifre iletilip mevcut kaynağa kopyalanır.
Şifre, depolandıktan sonra www.example.com
ve sonrasında tamamen aynı kaynakta kimlik bilgisi olarak kullanılabilir.
Aşağıdaki ekran görüntüsünde, login.aliexpress.com
altında depolanan kimlik bilgisi bilgileri m.aliexpress.com
tarafından görülebilir ve kullanıcı tarafından seçilebilir:
Chrome 60
Chrome 60, Credential Management API'de bazı önemli değişiklikler yaptı:
Şifreyi getirmek için özel
fetch()
işlevi artık gerekli olmadığından yakında kullanımdan kaldırılacak.navigator.credentials.get()
artıkunmediated
boole flag'i yerinemediation
enum'u kabul ediyor.requireUserMediation()
,preventSilentAccess()
olarak yeniden adlandırıldı.Yeni
navigator.credentials.create()
yöntemi eşzamansız olarak kimlik bilgisi nesneleri oluşturur.
Özellik algılamayla ilgilenmeniz gerekiyor
Şifre tabanlı ve birleşik kimlik bilgilerine erişmek için Credential Management API'nin kullanılabilir olup olmadığını öğrenmek için window.PasswordCredential
veya window.FederatedCredential
seçeneğinin olup olmadığını kontrol edin.
if (window.PasswordCredential || window.FederatedCredential) {
// The Credential Management API is available
}
PasswordCredential
nesnesi artık şifre içeriyor
Credential Management API'si şifreleri ele alma konusunda muhafazakar bir yaklaşım benimsedi.
JavaScript'teki şifreleri gizledi ve geliştiricilerin, fetch()
API'sine bir uzantı aracılığıyla doğrulama için PasswordCredential
nesnesini doğrudan kendi sunucularına göndermelerini gerektiriyordu.
Ancak bu yaklaşım, bir dizi kısıtlamaya neden oldu. Geliştiricilerin API'yi şu nedenlerle kullanamadığına dair geri bildirim aldık:
Şifreyi bir JSON nesnesinin parçası olarak göndermeleri gerekiyordu.
Şifrenin karma değerini kendi sunucularına göndermeleri gerekiyordu.
Bir güvenlik analizi yaptıktan ve şifreleri JavaScript'ten gizlemenin tüm saldırı vektörlerini umduğumuz kadar etkili şekilde önlemediğini öğrendikten sonra, değişiklik yapmaya karar verdik.
Credential Management API'si artık döndürülen kimlik bilgisi nesnesinde ham şifre içerdiğinden bu veriye düz metin olarak erişebilirsiniz. Sunucunuza kimlik bilgisi bilgilerini göndermek için mevcut yöntemleri kullanabilirsiniz:
navigator.credentials.get({
password: true,
federated: {
providers: [ 'https://accounts.google.com' ]
},
mediation: 'silent'
}).then(passwordCred => {
if (passwordCred) {
let form = new FormData();
form.append('email', passwordCred.id);
form.append('password', passwordCred.password);
form.append('csrf_token', csrf_token);
return fetch('/signin', {
method: 'POST',
credentials: 'include',
body: form
});
} else {
// Fallback to sign-in form
}
}).then(res => {
if (res.status === 200) {
return res.json();
} else {
throw 'Auth failed';
}
}).then(profile => {
console.log('Auth succeeded', profile);
});
Özel getirme yakında kullanımdan kaldırılacak
Özel bir fetch()
işlevi kullanıp kullanmadığınızı belirlemek için işlevin, credentials
özelliğinin değeri olarak bir PasswordCredential
veya FederatedCredential
nesnesi kullanıp kullanmadığını kontrol edin. Örneğin:
fetch('/signin', {
method: 'POST',
credentials: c
})
Önceki kod örneğinde gösterildiği gibi normal bir fetch()
işlevi veya bir XMLHttpRequest
kullanmanız önerilir.
navigator.credentials.get()
artık enum uyumlulaştırmasını kabul ediyor
navigator.credentials.get()
, Chrome 60 sürümüne kadar boole flag'i olan isteğe bağlı bir unmediated
özelliğini kabul ediyordu. Örneğin:
navigator.credentials.get({
password: true,
federated: {
providers: [ 'https://accounts.google.com' ]
},
unmediated: true
}).then(c => {
// Sign-in
});
unmediated: true
ayarlamak, tarayıcının bir kimlik bilgisi iletirken hesap seçiciyi göstermesini engeller.
İşaret, uyumlulaştırma olarak genişletildi. Kullanıcı uyumlulaştırması şu durumlarda gerçekleşebilir:
Kullanıcının oturum açmak için bir hesap seçmesi gerekir.
Bir kullanıcı,
navigator.credentials.requireUseMediation()
aramasından sonra açıkça oturum açmak istiyor.
mediation
değeri için aşağıdaki seçeneklerden birini belirleyin:
mediation değer |
Boole işareti ile karşılaştırıldı | Davranış | |
---|---|---|---|
silent |
unmediated: true değerine eşittir |
Kimlik bilgisi, hesap seçici gösterilmeden geçti. | |
optional |
unmediated: false değerine eşittir |
preventSilentAccess() daha önce aradıysa bir hesap seçici gösterir. |
|
required |
Yeni bir seçenek | Her zaman bir hesap seçici göster. Bir kullanıcının yerel hesap seçici iletişim kutusunu kullanarak hesap değiştirmesine izin vermek istediğinizde kullanışlıdır. |
Bu örnekte, kimlik bilgisi önceki unmediated: true
işaretinin eşdeğeri olan bir hesap seçici gösterilmeden iletilir:
navigator.credentials.get({
password: true,
federated: {
providers: [ 'https://accounts.google.com' ]
},
mediation: 'silent'
}).then(c => {
// Sign-in
});
requireUserMediation()
, preventSilentAccess()
olarak yeniden adlandırıldı
navigator.credentials.requireUserMediation()
yöntemi, get()
çağrısında sunulan yeni mediation
özelliğiyle uyumlu olması için navigator.credentials.preventSilentAccess()
olarak yeniden adlandırıldı.
Yeniden adlandırılan yöntem, hesap seçiciyi göstermeden kimlik bilgilerinin iletilmesini engeller (bazen kullanıcı uyumlulaştırması olmadan çağrılır). Bu, kullanıcı bir web sitesinden çıkış yaptığında veya bir web sitesindeki kaydını sildiğinde ve bir sonraki ziyaretinde otomatik olarak yeniden oturum açmak istemediğinde faydalıdır.
signoutUser();
if (navigator.credentials) {
navigator.credentials.preventSilentAccess();
}
Yeni navigator.credentials.create()
yöntemiyle kimlik bilgisi nesnelerini eşzamansız olarak oluşturun
Artık yeni navigator.credentials.create()
yöntemi ile kimlik bilgisi nesnelerini eşzamansız olarak oluşturma seçeneğine sahipsiniz.
Senkronize ve eşzamansız yaklaşımların karşılaştırmasını görmek için okumaya devam edin.
PasswordCredential
nesnesi oluşturuluyor
Senkronizasyon yaklaşımı
let c = new PasswordCredential(form);
Eş zamansız yaklaşım (yeni)
let c = await navigator.credentials.create({
password: form
});
veya:
let c = await navigator.credentials.create({
password: {
id: id,
password: password
}
});
FederatedCredential
nesnesi oluşturuluyor
Senkronizasyon yaklaşımı
let c = new FederatedCredential({
id: 'agektmr',
name: 'Eiji Kitamura',
provider: 'https://accounts.google.com',
iconURL: 'https://*****'
});
Eş zamansız yaklaşım (yeni)
let c = await navigator.credentials.create({
federated: {
id: 'agektmr',
name: 'Eiji Kitamura',
provider: 'https://accounts.google.com',
iconURL: 'https://*****'
}
});
Taşıma rehberi
Mevcut bir Credential Management API uygulamanız var mı? Yeni sürüme geçmek için izleyebileceğiniz bir taşıma kılavuzu dokümanımız var.