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

Geçiş anahtarları gibi FIDO kimlik bilgileri, şifrelerin yerini almayı amaçlasa da çoğu, kullanıcıyı kullanıcı adı yazma zahmetinden de kurtarabilir. Bu sayede kullanıcılar, mevcut web sitesi için sahip oldukları geçiş anahtarları 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 tasarlanmıştı ve potansiyel kimlik bilgilerinin kimliklerini gerektiriyordu. Bu nedenle, kullanıcı adı girilmesi gerekiyordu. Bir güvenlik anahtarının kimliklerini bilmeden bulabileceği kimlik bilgilerine bulunabilir kimlik bilgileri denir. Günümüzde oluşturulan çoğu FIDO kimlik bilgisi, özellikle de bir şifre yöneticisinde veya modern bir güvenlik anahtarında saklanan geçiş anahtarları, keşfedilebilir kimlik bilgileridir.

Kimlik bilgilerinizin geçiş anahtarı (bulunabilir kimlik bilgisi) olarak oluşturulması için kimlik bilgisi oluşturulurken residentKey ve requireResidentKey değerlerini belirtin.

Bağlı 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şturma sırasında ayarlanan user.name özelliğiyle tanımlanan mevcut geçiş anahtarlarının listesini gösterir. Kullanıcı birini seçerse user.id değeri, sonuçta elde edilen imzaya dahil edilir. Sunucu, yazılan bir kullanıcı adı yerine hesabı aramak için bu kimlik bilgisini veya döndürülen kimlik bilgisi kimliğini kullanabilir.

Daha önce ele alınanlar 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() cihazında 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': Keşfedilebilir bir kimlik bilgisi oluşturulmalıdır. Oluşturulamıyorsa NotSupportedError döndürülür.
  • 'preferred': Bağlı taraf, bulunabilir bir kimlik bilgisi oluşturmayı tercih eder ancak bulunamayan bir kimlik bilgisini de kabul eder.
  • 'discouraged': Güvenen taraf, bulunabilir olmayan bir kimlik bilgisi oluşturmayı tercih eder ancak bulunabilir bir kimlik bilgisini kabul eder.

requireResidentKey:

  • Bu özellik, spesifikasyonun eski bir sürümü olan WebAuthn Seviye 1'den geriye dönük uyumluluk için korunur. residentKey, 'required' ise bunu true olarak ayarlayın, aksi takdirde false olarak ayarlayın.

allowCredentials

Bağlı taraflar, geçiş anahtarı kimlik doğrulama deneyimini kontrol etmek için navigator.credentials.get() üzerinde allowCredentials kullanabilir. Genellikle üç tür geçiş anahtarı kimlik doğrulama deneyimi vardır:

Keşfedilebilir kimlik bilgileri sayesinde, bağlı taraflar kullanıcının oturum açmak için hesap seçebileceği kalıcı bir hesap seçici gösterebilir ve ardından kullanıcı doğrulaması yapılabilir. Bu, geçiş anahtarı kimlik doğrulaması için özel olarak ayrılmış 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 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ı formu otomatik doldurma özelliğini gösterme

Yukarıda açıklanan kalıcı 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 kalıcı iletişim kutusu yine de görünür ve kullanıcıya başka bir cihazdan geçiş anahtarı sunmasını önerir. 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çınmak isteyebilirsiniz.

Bunun yerine, geçiş anahtarı seçimi, geleneksel bir oturum açma formundaki alanlar için otomatik doldurma istemlerine, kayıtlı kullanıcı adları ve şifrelerle birlikte dahil edilebilir. Bu sayede, geçiş anahtarı olan bir kullanıcı 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 her ikisine de sahip olmayan kullanıcılar kullanıcı adlarını ve şifrelerini yazabilir.

Bu kullanıcı deneyimi, geçiş sürecindeki ve şifreler ile geçiş anahtarlarının karma şekilde kullanıldığı bağlı taraflar için idealdir.

Bu kullanıcı deneyimini elde etmek için allowCredentials özelliğine boş bir dizi iletmenin veya parametreyi atlamanın yanı sıra navigator.credentials.get() üzerinde mediation: 'conditional' değerini belirtin ve bir HTML username giriş alanına autocomplete="username webauthn" ile veya bir 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 mevcut geçiş anahtarları otomatik doldurma seçeneklerine dahil edilir. Kullanıcı birini 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ı bir geçiş anahtarı seçmezse vaat hiçbir zaman yerine getirilmez.

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=&qu>ot;username webauthn" ...

Bu kullanıcı deneyimini nasıl oluşturacağınızı Form otomatik doldurma özelliğiyle geçiş anahtarı kullanarak oturum açma başlıklı makaleden ve Web uygulamasında form otomatik doldurma özelliğiyle geçiş anahtarlarını uygulama codelab'inden öğrenebilirsiniz.

Yeniden kimlik doğrulama

Yeniden kimlik doğrulama için geçiş anahtarlarının kullanılması gibi bazı durumlarda kullanıcının tanımlayıcısı zaten bilinir. Bu durumda, tarayıcı veya OS herhangi bir hesap seçici göstermeden geçiş anahtarı kullanmak istiyoruz. Bunu yapmak için allowCredentials parametresinde kimlik bilgisi kimliklerinin listesini iletebilirsiniz.

Bu durumda, adlandırılmış kimlik bilgilerinden herhangi biri yerel olarak mevcutsa kullanıcıdan hemen cihazın kilidini açması istenir. Aksi takdirde kullanıcıdan, geçerli bir kimlik bilgisi içeren başka bir cihaz (telefon veya güvenlik anahtarı) sunması istenir.

Bu kullanıcı deneyimini sağlamak için oturum açan kullanıcının kimlik bilgilerinin listesini sağlayın. Kullanıcı zaten bilindiği için, bağlı taraf bunları sorgulayabilmelidir. Kimlik bilgilerini navigator.credentials.get() içindeki 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: Geçiş anahtarı kaydı sırasında bağlı tarafın aldığı ortak anahtar kimlik bilgisinin kimliği.
  • type: Bu alan genellikle 'public-key' olur.
  • transports: Bu kimlik bilgisini barındıran cihaz tarafından desteklenen aktarımlarla ilgili bir 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ı girmesine gerek kalmamasını sağlayarak geçiş anahtarıyla oturum açma deneyimini çok daha kullanıcı dostu hale getirir. residentKey, requireResidentKey ve allowCredentials kombinasyonu sayesinde, bağlı taraflar aşağıdaki oturum açma deneyimlerini sunabilir:

  • Kalıcı hesap seçiciyi gösterir.
  • Geçiş anahtarı formu otomatik doldurma özelliğini gösterme
  • Yeniden kimlik doğrulama.

Keşfedilebilir kimlik bilgilerini akıllıca kullanın. Böylece, kullanıcıların sorunsuz bulacağı ve daha fazla etkileşim kuracağı gelişmiş geçiş anahtarıyla oturum açma deneyimleri tasarlayabilirsiniz.