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

Ş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 ve dolayısıyla bir kullanıcı adı girmeyi gerektiriyordu. Güvenlik anahtarının kimliklerini bilmeden bulabileceği kimlik bilgilerine bulunabilir kimlik bilgileri denir. 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 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, 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 bahsedilenler gibi hesap seçici kullanıcı arayüzleri, hiçbir zaman bulunamayan kimlik bilgilerini göstermez.

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': Herkese açık bir kimlik bilgisi oluşturulmalıdır. Oluşturulamazsa NotSupportedError 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 bunu true, 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:

Bulanık 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ı bir yöntem seçerse normal cihaz kilidi açma doğrulamasından geçer ve yalnızca bu durumda .get() tarafından döndürülen söz bir sonuçla çözülür. 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ı Form otomatik doldurma özelliğiyle geçiş anahtarıyla oturum açma başlıklı makalede ve Web uygulamasında form otomatik doldurma özelliğiyle geçiş anahtarlarını uygulama codelab'inde öğrenebilirsiniz.

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, 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 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 ş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 içeren cihaz tarafından desteklenen aktarım ipucuna işaret eder. Tarayıcılar, kullanıcıdan harici bir cihaz göstermesini isteyen kullanıcı arayüzünü optimize etmek için bu ipuçlarını kullanır. Bu liste (varsa) 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 atlayarak 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:

  • 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 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.