Şifre anahtarları gibi FIDO kimlik bilgileri şifreleri değiştirmeyi amaçlasa da çoğu, kullanıcının kullanıcı adı yazmasını da önleyebilir. Bu sayede kullanıcılar, mevcut web sitesi için sahip oldukları geçiş anahtarlarının listesinden bir hesap seçerek kimlik doğrulaması yapabilir.
Güvenlik anahtarlarının önceki sürümleri 2 adımlı kimlik doğrulama yöntemleri olarak tasarlandığından, olası kimlik bilgilerinin kimliklerini gerektiriyordu ve dolayısıyla bir kullanıcı adı girmeyi zorunlu kılıyordu. Güvenlik anahtarının kimliklerini bilmeden bulabileceği kimlik bilgileri keşfedilebilir kimlik bilgileri olarak adlandırılır. Günümüzde oluşturulan FIDO kimlik bilgilerinin çoğu, özellikle şifre yöneticisinde veya modern bir güvenlik anahtarında depolanan geçiş anahtarları olmak üzere bulunabilir kimlik bilgileridir.
Kimlik bilgilerinizin geçiş anahtarı (bulunabilir kimlik bilgileri) 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, kullanıcıya oluşturulma sırasında ayarlanan user.name
mülkü ile tanımlanan mevcut geçiş anahtarlarının listesini gösterir. Kullanıcı bir değer seçerse user.id
değeri, oluşturulan imzaya dahil edilir. Sunucu daha sonra, yazılan kullanıcı adı yerine hesabı aramak için bu kimliği veya döndürülen kimlik bilgisi kimliğini kullanabilir.
Daha önce tartışılanlar gibi hesap seçici kullanıcı arayüzleri, keşfedilemeyen kimlik bilgilerini hiçbir zaman göstermez.
requireResidentKey
ve residentKey
Geçiş anahtarı oluşturmak için navigator.credentials.create()
üzerinde aşağıdaki gibi authenticatorSelection.residentKey
ve authenticatorSelection.requireResidentKey
değerlerini 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'
: Herkese açık bir kimlik bilgisi oluşturulmalıdır. Oluşturulamaması durumundaNotSupportedError
döndürülür.'preferred'
: RP, herkese açık bir kimlik bilgisi oluşturmayı tercih eder ancak herkese açık olmayan bir kimlik bilgisini de kabul eder.'discouraged'
: RP, bulunamayan 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 ile geriye dönük uyumluluk için korunur.
residentKey
'required'
ise bunutrue
, aksi takdirdefalse
olarak ayarlayın.
allowCredentials
RP'ler, geçiş anahtarı kimlik doğrulama deneyimini kontrol etmek için navigator.credentials.get()
'da allowCredentials
kullanabilir. Genellikle üç tür geçiş anahtarı kimlik doğrulama deneyimi vardır:
- Modal hesap seçici gösterme
- Geçiş anahtarı formunu otomatik doldurma özelliğini gösterme
- Yeniden kimlik doğrulama
Modal hesap seçici gösterme
Keşfedilebilir kimlik bilgileri sayesinde RP'ler, kullanıcının oturum açacağı hesabı seçebileceği bir modal hesap seçici gösterebilir ve ardından kullanıcı doğrulamasını yapabilir. Bu, geçiş anahtarı kimlik doğrulamasına özel 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()
parametresinde 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ı formunu otomatik doldurma özelliğini gösterme
Yukarıda açıklanan modal hesap seçici, çoğu kullanıcı geçiş anahtarı kullanıyorsa ve bu anahtarlar yerel cihazda mevcutsa iyi çalışır. Yerel geçiş anahtarı olmayan kullanıcılar için modal iletişim kutusu yine de gösterilir ve kullanıcıya başka bir cihazdan geçiş anahtarı sunması teklif edilir. 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ü kullanmaktan kaçınabilirsiniz.
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 bu çiftleri seçebilir, bu iki seçenekten hiçbirine sahip olmayan kullanıcılar ise kullanıcı adlarını ve şifrelerini yazmaya devam edebilir.
Bu kullanıcı deneyimi, RP'de şifre ve geçiş anahtarlarının birlikte kullanıldığı bir taşıma işlemi devam ederken idealdir.
Bu kullanıcı deneyimini elde etmek için allowCredentials
mülküne boş bir dizi göndermenin veya parametreyi atlamanın yanı sıra navigator.credentials.get()
üzerinde mediation: 'conditional'
'ü belirtin ve bir HTML username
giriş alanını autocomplete="username webauthn"
ile veya bir password
giriş alanını autocomplete="password webauthn"
ile ek açıklamayla belirtin.
navigator.credentials.get()
çağrısı herhangi bir kullanıcı arayüzünün gösterilmesine neden olmaz ancak kullanıcı, ek açıklamalı giriş alanına odaklanırsa mevcut şifre anahtarları otomatik doldurma seçeneklerine dahil edilir. Kullanıcı birini seçerse normal cihazın kilidini açma doğrulamasından geçer ve ancak bunun ardından .get()
tarafından verilen söz, sonuçla çözümlenir. Kullanıcı geçiş anahtarı seçmezse söz hiçbir zaman çözülmez.
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ı öğrenmek için Form otomatik doldurma özelliğiyle geçiş anahtarıyla oturum açma ve Geçiş anahtarlarını web uygulamasında form otomatik doldurma özelliğiyle uygulama codelab'ini inceleyebilirsiniz.
Yeniden kimlik doğrulama
Yeniden kimlik doğrulama için geçiş anahtarları kullanıldığında olduğu gibi bazı durumlarda kullanıcının tanımlayıcı bilgisi zaten bilinir. Bu durumda, tarayıcı veya işletim sistemi herhangi bir hesap seçici biçimi göstermeden geçiş anahtarı kullanmak isteriz. Bu, allowCredentials
parametresinde kimlik bilgisi kimliklerinin listesi ile yapılabilir.
Bu durumda, belirtilen kimlik bilgilerinden herhangi biri yerel olarak mevcutsa kullanıcıdan hemen cihazı kilitlemesi istenir. Aksi takdirde, kullanıcıdan geçerli kimlik bilgisi içeren başka bir cihaz (telefon veya güvenlik anahtarı) göstermesi istenir.
Bu kullanıcı deneyimini elde etmek için oturum açan kullanıcının kimlik bilgisi kimliklerinin listesini sağlayın. Kullanıcı zaten bilindiği için kısıtlanmış taraf bunları sorgulayabilir. navigator.credentials.get()
içindeki allowCredentials
mülkünde 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 şunları içerir:
id
: RP'nin geçiş anahtarı kaydında edindiği ortak anahtar kimlik bilgisi.type
: Bu alan genellikle'public-key'
değerini alır.transports
: Bu kimlik bilgisini barındıran cihazın desteklediği aktarımlara dair bir ipucudur. Bu ipucu, tarayıcılar tarafından kullanıcıdan harici bir cihaz sunmasını isteyen kullanıcı arayüzünü optimize etmek için kullanılır. Bu liste (varsa) her kimlik bilgisinin kaydı sırasındagetTransports()
çağrısının sonucunu içermelidir.
Özet
Keşfedilebilir kimlik bilgileri, kullanıcıların kullanıcı adı girmesini atlamasına olanak tanıyarak geçiş anahtarıyla oturum açma deneyimini çok daha kullanıcı dostu hale getirir. residentKey
, requireResidentKey
ve allowCredentials
'nin kombinasyonuyla RP'ler şu oturum açma deneyimlerini sağlayabilir:
- Kalıcı bir hesap seçici gösterin.
- Geçiş anahtarı formunu otomatik doldurmayı göster.
- Yeniden kimlik doğrulama.
Bulunabilir kimlik bilgilerini akıllıca kullanın. Bu sayede, kullanıcıların sorunsuz bulacağı ve etkileşime geçme olasılığının daha yüksek olduğu gelişmiş geçiş anahtarı oturum açma deneyimleri tasarlayabilirsiniz.