Geçiş anahtarları gibi FIDO kimlik bilgileri şifrelerin yerini almayı amaçlasa da çoğu, kullanıcıyı kullanıcı adı yazmaktan da kurtarabilir. Bu, kullanıcıların mevcut web sitesi için sahip oldukları geçiş anahtarlarının listesinden bir hesap seçerek kimlik doğrulaması yapmasına olanak tanır.
Güvenlik anahtarlarının önceki sürümleri, 2 adımlı kimlik doğrulama yöntemleri olarak tasarlanmıştı ve olası kimlik bilgilerinin kimliklerini gerektiriyordu. Bu nedenle, kullanıcı adı girilmesi gerekiyordu. Güvenlik anahtarının kimliklerini bilmeden bulabileceği kimlik bilgilerine bulunabilir kimlik bilgileri denir. Günümüzde oluşturulan çoğu FIDO kimlik bilgisi, keşfedilebilir kimlik bilgileridir. Özellikle de şifre yöneticisinde veya modern bir güvenlik anahtarında saklanan geçiş anahtarları.
Kimlik bilgilerinizin geçiş anahtarı (bulunabilir kimlik bilgisi) olarak oluşturulmasını sağlamak için kimlik bilgisi oluşturulurken residentKey ve requireResidentKey değerlerini belirtin.
Güvenen taraflar (RP'ler), geçiş anahtarı kimlik doğrulaması sırasında allowCredentials öğesini atlayarak bulunabilir kimlik bilgilerini kullanabilir. Bu gibi durumlarda tarayıcı veya sistem, oluşturma sırasında ayarlanan user.name özelliğiyle tanımlanan, kullanılabilir geçiş anahtarlarının listesini kullanıcıya gösterir. Kullanıcı birini seçerse user.id
değeri, sonuçta elde edilen imzaya dahil edilir. Sunucu daha sonra, yazılan bir kullanıcı adı yerine hesabı aramak için bu kimlik bilgisini veya döndürülen kimlik bilgisi kimliğini kullanabilir.
Daha önce bahsedilenler gibi hesap seçici kullanıcı arayüzlerinde, bulunamayan kimlik bilgileri asla gösterilmez.
requireResidentKey ve residentKey
Geçiş anahtarı oluşturmak için navigator.credentials.create() üzerinde authenticatorSelection.residentKey ve authenticatorSelection.requireResidentKey değerlerini aşağıdaki gibi belirtin.
async function register () {
// ...
const publicKeyCredentialCreationOptions = {
// ...
authenticatorSelection: {
authenticatorAttachment: 'platform',
residentKey: 'required',
requireResidentKey: true,
}
};
const credential = await navigator.credentials.create({
publicKey: publicKeyCredentialCreationOptions
});
// This does not run until the user selects a passkey.
const credential = {};
credential.id = cred.id;
credential.rawId = cred.id; // Pass a Base64URL encoded ID string.
credential.type = cred.type;
// ...
}
residentKey:
'required': Bulunabilir bir kimlik bilgisi oluşturulmalıdır. OluşturulamazsaNotSupportedErrordöndürülür.'preferred': RP, bulunabilir bir kimlik bilgisi oluşturmayı tercih eder ancak bulunamayan bir kimlik bilgisini de kabul eder.'discouraged': RP, bulunabilir olmayan bir kimlik bilgisi oluşturmayı tercih eder ancak bulunabilir bir kimlik bilgisini de kabul eder.
requireResidentKey:
- Bu özellik, spesifikasyonun eski bir sürümü olan WebAuthn Level 1'den geriye dönük uyumluluk için korunur.
residentKey,'required'ise bunutrueolarak, aksi takdirdefalseolarak ayarlayın.
allowCredentials
RP'ler, geçiş anahtarı kimlik doğrulama deneyimini kontrol etmek için navigator.credentials.get() üzerinde allowCredentials kullanabilir. Genellikle üç tür geçiş anahtarı kimlik doğrulama deneyimi vardır:
- Modal hesap seçiciyi gösterme
- Geçiş anahtarı formunu otomatik doldurma özelliğini gösterme
- Yeniden kimlik doğrulama
Modal hesap seçiciyi gösterme
Bulunabilir kimlik bilgileri sayesinde RP'ler, kullanıcının oturum açmak için bir hesap seçebileceği bir modal hesap seçici gösterebilir. Ardından kullanıcı doğrulaması yapılır. Bu, geçiş anahtarı kimlik doğrulamasına ayrılmış bir düğmeye basılarak başlatılan geçiş anahtarı kimlik doğrulama akışı için uygundur.
Bu kullanıcı deneyimini elde etmek için navigator.credentials.get() içinde allowCredentials parametresini atlayın veya boş bir dizi iletin.
async function authenticate() {
// ...
const publicKeyCredentialRequestOptions = {
// Server generated challenge:
challenge: ****,
// The same RP ID as used during registration:
rpId: 'example.com',
// You can omit `allowCredentials` as well:
allowCredentials: []
};
const credential = await navigator.credentials.get({
publicKey: publicKeyCredentialRequestOptions,
signal: abortController.signal
});
// This does not run until the user selects a passkey.
const credential = {};
credential.id = cred.id;
credential.rawId = cred.id; // Pass a Base64URL encoded ID string.
credential.type = cred.type;
// ...
}
Geçiş anahtarı formu otomatik doldurma işlemini gösterme
Yukarıda açıklanan modal hesap seçici, çoğu kullanıcı geçiş anahtarı kullanıyorsa ve geçiş anahtarları yerel cihazda mevcutsa iyi çalışır. Yerel geçiş anahtarı olmayan kullanıcılar için modal iletişim kutusu görünmeye devam eder ve kullanıcıya başka bir cihazdaki geçiş anahtarını sunma seçeneği sunulur. Kullanıcılarınızı geçiş anahtarlarına geçirirken, geçiş anahtarı oluşturmamış kullanıcılar için bu kullanıcı arayüzünü göstermemeyi tercih edebilirsiniz.
Bunun yerine, geçiş anahtarı seçimi, kaydedilen kullanıcı adları ve şifrelerin yanı sıra geleneksel bir oturum açma formundaki alanlar için otomatik doldurma istemlerine dahil edilebilir. Bu sayede, geçiş anahtarı olan kullanıcılar geçiş anahtarlarını seçerek oturum açma formunu "doldurabilir", kayıtlı kullanıcı adı/şifre çiftleri olan kullanıcılar bunları seçebilir ve ikisi de olmayan kullanıcılar kullanıcı adlarını ve şifrelerini yazmaya devam edebilir.
Bu kullanıcı deneyimi, RP'nin şifrelerin ve geçiş anahtarlarının karma kullanımıyla birlikte bir taşıma işlemi gerçekleştirdiği durumlarda idealdir.
Bu kullanıcı deneyimini elde etmek için allowCredentials özelliğine boş bir dizi iletmenin veya parametreyi atlamanın yanı sıra navigator.credentials.get() üzerinde mediation: 'conditional' değerini belirtin ve bir HTML username giriş alanını autocomplete="username webauthn" ile veya bir password giriş alanını autocomplete="password webauthn" ile açıklama ekleyin.
navigator.credentials.get() çağrısı herhangi bir kullanıcı arayüzünün gösterilmesine neden olmaz ancak kullanıcı, açıklama eklenmiş giriş alanına odaklanırsa kullanılabilir tüm geçiş anahtarları otomatik doldurma seçeneklerine dahil edilir. Kullanıcı birini seçerse normal cihaz kilidi açma doğrulamasından geçer ve ancak o zaman .get() tarafından döndürülen söz sonuçla çözümlenir. Kullanıcı geçiş anahtarı seçmezse söz hiçbir zaman yerine getirilmez.
async function authenticate() {
// ...
const publicKeyCredentialRequestOptions = {
// Server generated challenge:
challenge: ****,
// The same RP ID as used during registration:
rpId: 'example.com',
// You can omit `allowCredentials` as well:
allowCredentials: []
};
const cred = await navigator.credentials.get({
publicKey: publicKeyCredentialRequestOptions,
signal: abortController.signal,
// Specify 'conditional' to activate conditional UI
mediation: 'conditional'
});
// This does not run until the user selects a passkey.
const credential = {};
credential.id = cred.id;
credential.rawId = cred.id; // Pass a Base64URL encoded ID string.
credential.type = cred.type;
// ...
}
<input type="text" name="username" autocomplete="username webauthn" ...>
Bu kullanıcı deneyimini nasıl oluşturacağınızı Form otomatik doldurma özelliğiyle geçiş anahtarıyla oturum açma başlıklı makalenin yanı sıra Web uygulamasında form otomatik doldurma özelliğiyle geçiş anahtarlarını uygulama başlıklı codelab'den öğrenebilirsiniz.
Yeniden kimlik doğrulama
Yeniden kimlik doğrulama için geçiş anahtarları kullanma gibi bazı durumlarda kullanıcının tanımlayıcısı zaten bilinir. Bu durumda, tarayıcı veya işletim sistemi herhangi bir hesap seçici göstermeden geçiş anahtarı kullanmak istiyoruz. Bu, allowCredentials parametresinde kimlik bilgisi kimliklerinin bir listesini ileterek yapılabilir.
Bu durumda, adlandırılmış kimlik bilgilerinden herhangi biri yerel olarak mevcutsa kullanıcıdan doğrudan cihaz kilidini açması istenir. Aksi takdirde, kullanıcıdan geçerli bir kimlik bilgisi içeren başka bir cihaz (telefon veya güvenlik anahtarı) sunması istenir.
Bu kullanıcı deneyimini sağlamak için oturum açan kullanıcının kimlik bilgisi kimliklerinin listesini sağlayın. Kullanıcı zaten bilindiği için RP, bu verileri sorgulayabilmelidir. navigator.credentials.get() içindeki allowCredentials özelliğinde kimlik bilgisi kimliklerini PublicKeyCredentialDescriptor nesneleri olarak sağlayın.
async function authenticate() {
// ...
const publicKeyCredentialRequestOptions = {
// Server generated challenge:
challenge: ****,
// The same RP ID as used during registration:
rpId: 'example.com',
// Provide a list of PublicKeyCredentialDescriptors:
allowCredentials: [{
id: ****,
type: 'public-key',
transports: [
'internal',
'hybrid'
]
}, {
id: ****,
type: 'public-key',
transports: [
'internal',
'hybrid'
]
}, ...]
};
const credential = await navigator.credentials.get({
publicKey: publicKeyCredentialRequestOptions,
signal: abortController.signal
});
// This does not run until the user selects a passkey.
const credential = {};
credential.id = cred.id;
credential.rawId = cred.id; // Pass a Base64URL encoded ID string.
credential.type = cred.type;
// ...
}
PublicKeyCredentialDescriptor nesnesi şunlardan oluşur:
id: RP'nin geçiş anahtarı kaydı sırasında aldığı ortak anahtar kimlik bilgisinin kimliği.type: Bu alan genellikle'public-key'olur.transports: Bu kimlik bilgisini içeren cihaz tarafından desteklenen aktarımlarla ilgili bir ipucu. Tarayıcılar, kullanıcıdan harici bir cihaz sunmasını isteyen kullanıcı arayüzünü optimize etmek için bu ipucunu kullanır. Bu liste, sağlanırsa her kimlik bilgisinin kaydı sırasındagetTransports()çağrısının sonucunu içermelidir.
Özet
Bulunabilir kimlik bilgileri, kullanıcıların kullanıcı adı girmeyi atlamasına olanak tanıyarak geçiş anahtarıyla oturum açma deneyimini çok daha kullanıcı dostu hale getirir. residentKey, requireResidentKey ve allowCredentials kombinasyonuyla RP'ler, aşağıdaki gibi oturum açma deneyimleri sunabilir:
- Modal hesap seçici gösterin.
- Geçiş anahtarı formu otomatik doldurma işlemini göster.
- Yeniden kimlik doğrulama.
Bulunabilir kimlik bilgilerini akıllıca kullanın. Bunu yaparak, kullanıcıların sorunsuz bulacağı ve etkileşimde bulunma olasılıklarının daha yüksek olacağı gelişmiş geçiş anahtarıyla oturum açma deneyimleri tasarlayabilirsiniz.