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

Geçiş anahtarları gibi FIDO kimlik bilgileri şifreleri değiştirmeyi amaçlasa da çoğu, kullanıcının kullanıcı adı yazmasını engeller. 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şturulduğundan emin olmak için kimlik bilgisi oluşturulduğunda residentKey ve requireResidentKey değerini 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, bu kimliği veya döndürülen kimlik bilgisi kimliğini kullanarak, yazılan kullanıcı adı yerine hesabı arayabilir.

Daha önce tartışılanlar gibi hesap seçici kullanıcı arayüzleri hiçbir zaman bulunabilir değil olarak gösterilmez kimlik bilgileri.

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': Bulunabilir bir kimlik bilgisi oluşturulmalıdır. Oluşturulamaması durumunda NotSupportedError döndürülür.
  • 'preferred': Kısıtlanmış taraf, bulunabilir kimlik bilgisi oluşturmayı tercih ediyor ancak bulunamayan kimlik bilgilerini kabul ediyor.
  • 'discouraged': Kısıtlanmış taraf, bulunabilir olmayan kimlik bilgileri oluşturmayı tercih ediyor ancak bulunabilir kimlik bilgilerini kabul ediyor.

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 bu değeri true olarak ayarlayın; aksi takdirde false 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:

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() içindeki allowCredentials parametresine boş bir diziyi atlayın veya 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 doldurmayı göster

Yukarıda açıklanan kalıcı hesap seçici, kullanıcıların çoğu geçiş anahtarları kullandığında ve geçiş anahtarlarını yerel cihazda tuttuğunda işe yarar. 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ş anahtarına geçirirken, geçiş anahtarı oluşturmamış kullanıcıların bu kullanıcı arayüzünü kullanmamasını öneririz.

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.

Kısıtlanmış taraf, şifre ve geçiş anahtarının birlikte kullanıldığı bir taşıma işlemi gerçekleştiriyorsa bu kullanıcı deneyimi idealdir.

Bu kullanıcı deneyimini sunmak için allowCredentials özelliğine boş bir dizi iletmeye veya parametreyi atlamaya ek olarak, navigator.credentials.get() üzerinde mediation: 'conditional' değerini belirtin ve HTML username giriş alanına autocomplete="username webauthn" veya password giriş alanına autocomplete="password webauthn" ile 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ı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 taahhüt hiçbir zaman geçerli olmaz.

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 göstermeden geçiş anahtarı kullanmak isteriz. Bu, allowCredentials parametresinde kimlik bilgisi kimliklerinin listesi ile yapılabilir.

Bu durumda, adlandırılmış kimlik bilgilerinden herhangi biri yerel olarak kullanılabiliyorsa kullanıcıdan cihazın kilidini hemen açması 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 sağlamak için oturum açan kullanıcıya ait kimlik bilgisi kimliklerinin listesini sağlayın. Kullanıcı zaten bilindiği için RP 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 şunlardan oluşur:

  • 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 (sağlanmışsa) her kimlik bilgisinin kaydı sırasında getTransports() ç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. Kısıtlanmış taraf, residentKey, requireResidentKey ve allowCredentials kombinasyonlarını kullanarak şu özelliklere sahip oturum açma deneyimleri sağlayabilir:

  • Modal hesap seçici gösterin.
  • Geçiş anahtarı formunun otomatik doldurulmasını gösterin.
  • Yeniden kimlik doğrulama.

Bulunabilir kimlik bilgilerini akıllıca kullanın. Bu sayede, kullanıcıların sorunsuz bulacakları ve etkileşim kurma olasılıklarının daha yüksek olacağı gelişmiş geçiş anahtarı oturum açma deneyimleri tasarlayabilirsiniz.