Geçiş anahtarı gibi FIDO kimlik bilgileri şifrelerin yerini almayı amaçlar ancak çoğu aynı zamanda kullanıcının kullanıcı adı yazmasını da engelleyebilir. Böylece kullanıcılar, geçerli web sitesi için sahip oldukları geçiş anahtarları listesinden 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 tasarlanmış ve olası kimlik bilgilerinin kimliklerini gerektirmesi nedeniyle kullanıcı adı girilmesini gerektiriyordu. Bir güvenlik anahtarının, kimliklerini bilmeden bulabileceği kimlik bilgilerine bulunabilir kimlik bilgisi adı verilir. Bugün oluşturulan çoğu FIDO kimlik bilgisi, özellikle de bir şifre yöneticisinde veya modern bir güvenlik anahtarında depolanan geçiş anahtarları olmak üzere herkese açık kimlik bilgileridir.
Kimlik bilgilerinizin bulunabilir olduğundan emin olmak için geçiş anahtarı oluşturulurken residentKey
ve requireResidentKey
değerlerini belirtin.
Bağlı taraflar (RP'ler), geçiş anahtarı kimlik doğrulaması sırasında allowCredentials
parametresini çıkararak bulunabilir kimlik bilgilerini kullanabilir. Bu durumlarda tarayıcı veya sistem, kullanıcıya oluşturma sırasında ayarlanan user.name
mülküyle tanımlanan mevcut geçiş anahtarlarının listesini gösterir. Kullanıcı bir seçim yaparsa user.id
değeri oluşturulan imzaya dahil edilir. Daha sonra sunucu, hesabı aramak için yazılan kullanıcı adı yerine bu bilgiyi veya döndürülen kimlik bilgisi kimliğini kullanabilir.
Daha önce tartışılanlar gibi hesap seçici kullanıcı arayüzleri, bulunabilir olmayan kimlik bilgilerini hiçbir zaman göstermez.
requireResidentKey
ve residentKey
Herkese açık kimlik bilgisi oluşturmak için navigator.credentials.create()
üzerinde authenticatorSelection.residentKey
ve authenticatorSelection.requireResidentKey
özelliklerini aşağıdaki gibi belirtilen değerlerle 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 kimlik bilgisi oluşturulmalıdır. OluşturulamazsaNotSupportedError
döndürülür.'preferred'
: Kısıtlanmış taraf, bulunabilir kimlik bilgisi oluşturmayı tercih etse de bulunamaz kimlik bilgilerini kabul eder.'discouraged'
: Kısıtlanmış taraf, bulunabilir olmayan kimlik bilgileri oluşturmayı tercih eder ancak bulunabilir kimlik bilgilerini kabul eder.
requireResidentKey
:
- Bu özellik, spesifikasyonun daha eski bir sürümü olan WebAuthn Düzey 1'den geriye dönük uyumluluk amacıyla saklanır.
residentKey
değeri'required'
ise bunutrue
olarak, aksi takdirdefalse
olarak ayarlayın.
allowCredentials
RP'ler, geçiş anahtarı kimlik doğrulama deneyimini kontrol etmek için navigator.credentials.get()
üzerinde allowCredentials
özelliğini kullanabilir. Genellikle üç tür geçiş anahtarı kimlik doğrulama deneyimi vardır:
- Kalıcı hesap seçici gösterme
- Geçiş anahtarı formunu otomatik doldurma özelliğini gösterme
- Yeniden kimlik doğrulama
Kalıcı hesap seçici göster
Herkese açık kimlik bilgileriyle RP'ler, kullanıcının oturum açacağı hesabı seçmesi için kalıcı hesap seçici ve ardından kullanıcı doğrulaması gösterebilir. 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 sağlamak için navigator.credentials.get()
ürününde allowCredentials
parametresini çıkarın veya bu parametreye 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öster
Yukarıda açıklanan kalıcı hesap seçici, çoğu kullanıcı geçiş anahtarı kullanıyorsa ve geçiş anahtarı yerel cihazda mevcutsa iyi sonuç verir. Yerel geçiş anahtarları olmayan kullanıcılar için kalıcı iletişim kutusu görünmeye devam eder ve kullanıcıya başka bir cihazdan geçiş anahtarı sunmasını önerir. Kullanıcılarınızı geçiş anahtarına geçirirken, geçiş anahtarı ayarlamamış kullanıcılar için bu kullanıcı arayüzünü kullanmamak isteyebilirsiniz.
Bunun yerine, geçiş anahtarı seçimi, kayıtlı kullanıcı adları ve şifrelerle birlikte geleneksel oturum açma formundaki alanlar için otomatik doldurma istemlerine birleştirilebilir. Bu sayede, geçiş anahtarı olan kullanıcılar geçiş anahtarını seçerek oturum açma formunu "doldurabilir", kayıtlı kullanıcı adı/şifre çiftleri olan kullanıcılar bunları seçebilir ve ikisine de sahip olmayan kullanıcılar kullanıcı adlarını ve şifrelerini yazmaya devam edemez.
Kısıtlanmış taraf, şifre ve şifre anahtarlarının karma kullanıldığı bir taşıma sürecindeyse bu kullanıcı deneyimi idealdir.
Bu kullanıcı deneyimini elde etmek için allowCredentials
mülküne boş bir dizi iletmenin veya parametreyi atlamanın yanı sıra navigator.credentials.get()
üzerinde mediation: 'conditional'
belirtin ve HTML username
giriş alanına autocomplete="username webauthn"
veya password
giriş alanı ile autocomplete="password webauthn"
ek açıklama ekleyin.
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 kullanılabilir geçiş anahtarları otomatik doldurma seçeneklerine dahil edilir. Kullanıcı birini seçerse normal cihaz kilit açma doğrulamasından geçer ve ancak bundan sonra .get()
tarafından verilen sözü veren sonuç bir sonuç verir. Kullanıcı geçiş anahtarı seçmezse sözü hiçbir zaman çözüme kavuşturulmaz.
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 başlıklı makaleyi ve Web uygulamasında form otomatik doldurma özelliğiyle geçiş anahtarlarını uygulama codelab'ini inceleyebilirsiniz.
Yeniden kimlik doğrulama
Yeniden kimlik doğrulama için geçiş anahtarı kullanılması gibi bazı durumlarda, kullanıcının tanımlayıcısı zaten bilinmektedir. Bu durumda, tarayıcı veya işletim sistemi herhangi bir hesap seçici biçimi göstermeyen bir geçiş anahtarı kullanmak isteriz. Bu, allowCredentials
parametresinde kimlik bilgisi kimliklerinin listesini ileterek gerçekleştirilebilir.
Bu durumda, adlandırılmış kimlik bilgilerinden herhangi biri yerel olarak kullanılabiliyorsa kullanıcıdan hemen cihazın kilidini açması istenir. Aksi takdirde, kullanıcıdan geçerli kimlik bilgilerine sahip başka bir cihaz (telefon veya güvenlik anahtarı) sunması istenir.
Bu kullanıcı deneyimini sağlamak için oturum açan kullanıcıya yönelik kimlik bilgisi kimliklerinin listesini sağlayın. Kullanıcı zaten tanındığı için kısıtlanmış taraf bunları sorgulayabilmelidir. Kimlik bilgisi kimliklerini navigator.credentials.get()
konumundaki allowCredentials
özelliğinde 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ından aldığı ortak anahtar kimlik bilgilerinin kimliği.type
: Bu alan genellikle'public-key'
şeklindedir.transports
: Bu kimlik bilgisini içeren cihaz tarafından desteklenen aktarımlara dair bir ipucu. Tarayıcılar tarafından kullanıcıdan harici bir cihaz göstermesini isteyen kullanıcı arayüzünü optimize etmek için kullanılır. Bu liste (sağlanmışsa), her bir kimlik bilgisinin kaydı sırasındagetTransports()
çağrısının sonucunu içermelidir.
Özet
Keşfedilebilir kimlik bilgileri, kullanıcı adı girmelerini engelleyerek geçiş anahtarı oturum açma deneyimini çok daha kullanıcı dostu hale getirir. RP'ler residentKey
, requireResidentKey
ve allowCredentials
kombinasyonunu kullanarak şu özelliklere sahip oturum açma deneyimleri gerçekleştirebilir:
- Kalıcı hesap seçici gösterin.
- Geçiş anahtarı formunu otomatik doldurma özelliğini göster.
- Yeniden kimlik doğrulama.
Keşfedilebilir kimlik bilgilerini akıllıca kullanın. Bu sayede, kullanıcıların sorunsuz bulacağı ve etkileşimde bulunma ihtimalinin daha yüksek olacağı gelişmiş geçiş anahtarı oturum açma deneyimleri tasarlayabilirsiniz.