Keşfedilebilir kimlik bilgilerinin ayrıntılı incelemesi

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şturulamazsa NotSupportedError 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 bunu true olarak, aksi takdirde false 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:

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ında getTransports() ç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.