Signal API ile geçiş anahtarlarını sunucunuzdaki kimlik bilgileriyle tutarlı tutun

Yayınlanma tarihi: 12 Kasım 2024

WebAuthn Signal API, güvenen tarafların mevcut kimlik bilgilerini bağlı geçiş anahtarı sağlayıcılarına iletmesine olanak tanır. Bu sayede, geçiş anahtarını destekleyen sağlayıcılar yanlış veya iptal edilmiş geçiş anahtarlarını güncelleyebilir ya da depolama alanlarından kaldırabilir. Böylece, bu anahtarlar kullanıcılara sunulmaz.

Uyumluluk

Masaüstünde Chrome, Chrome 132'den itibaren Signal API'yi destekler. Google Şifre Yöneticisi, geçiş anahtarlarını sinyali yansıtacak şekilde güncelleyebilir. Chrome uzantısı tabanlı geçiş anahtarı sağlayıcılar, sinyali yansıtıp yansıtmayacaklarına kendileri karar verir.

Android'de Chrome desteği daha sonra kullanıma sunulacaktır.

Safari bu özelliği destekler ancak henüz uygulanmamıştır. Firefox henüz görüşlerini paylaşmadı.

Arka plan

Bir geçiş anahtarı (bulunabilir kimlik bilgisi) oluşturulduğunda, kullanıcı adı ve görünen ad gibi meta veriler, özel anahtarla birlikte geçiş anahtarı sağlayıcıya (ör. şifre yöneticisi) kaydedilir. Ortak anahtar kimlik bilgisi ise güvenen tarafın (RP) sunucusuna kaydedilir. Kullanıcı adı ve görünen ad kaydedildiğinde, kullanıcı istendiğinde sunulan geçiş anahtarlarından hangisini kullanarak oturum açacağını belirleyebilir. Bu, özellikle farklı geçiş anahtarı sağlayıcılarından ikiden fazla geçiş anahtarı olduğunda kullanışlıdır.

Ancak geçiş anahtarı sağlayıcının geçiş anahtarı listesi ile sunucunun kimlik bilgileri listesi arasında tutarsızlıkların kafa karışıklığına yol açabileceği birkaç durum vardır.

İlk durum, kullanıcının geçiş anahtarı sağlayıcısındaki geçiş anahtarına dokunmadan sunucuda bir kimlik bilgisini silmesidir. Kullanıcı bir sonraki sefer geçiş anahtarıyla oturum açmaya çalıştığında geçiş anahtarı sağlayıcısı bu geçiş anahtarını kullanıcıya yine sunar. Ancak sunucu, silinen ortak anahtarla doğrulama yapamayacağı için oturum açma denemesi başarısız olur.

İkinci durum, kullanıcının sunucudaki kullanıcı adını veya görünen adını güncellemesidir. Kullanıcı bir sonraki oturum açmaya çalıştığında, geçiş anahtarı sağlayıcısındaki geçiş anahtarı, sunucudaki güncellemeye rağmen eski kullanıcı adını ve görünen adı göstermeye devam eder. İdeal olarak senkronize olmalıdırlar.

Signal API

Signal API, RP'lerin geçiş anahtarı sağlayıcısında değişiklik sinyali göndermesine izin vererek bu karışıklıkları çözen bir WebAuthn API'sidir. Üç yöntem vardır:

Bir kimlik bilgisinin mevcut olmadığını belirtme

const credential = await navigator.credentials.get({ ... });
const payload = credential.toJSON();

const result = await fetch('/login', { ... });

// Detect authentication failure due to lack of the credential
if (result.status === 404) {
  // Feature detection
  if (PublicKeyCredential.signalUnknownCredential) {
    await PublicKeyCredential.signalUnknownCredential({
      rpId: "example.com",
      credentialId: "vI0qOggiE3OT01ZRWBYz5l4MEgU0c7PmAA" // base64url encoded credential ID
    });
  } else {
    // Encourage the user to delete the passkey from the password manager nevertheless.
    ...
  }
}

RP, PublicKeyCredential.signalUnknownCredential()'yi bir RP kimliği ve kimlik bilgisi kimliğiyle çağırarak geçiş anahtarı sağlayıcıyı, belirtilen kimlik bilgisinin kaldırıldığını veya mevcut olmadığını bilgilendirebilir. Bu sinyalle nasıl başa çıkılacağı geçiş anahtarı sağlayıcıya bağlıdır ancak ilişkili kimlik bilgisi mevcut olmadığından kullanıcının geçiş anahtarıyla oturum açmaması için ilişkili geçiş anahtarının kaldırılması beklenir.

Bu API, kimlik bilgisi eksikliği nedeniyle geçiş anahtarına dayalı oturum açma işlemi başarısız olduğunda çağrılabilir. Bu sayede, RP kullanıcının ilişkili kimlik bilgisi olmayan bir geçiş anahtarıyla oturum açmaya çalışmasını engelleyebilir. signalAllAcceptedCredentials'ün aksine bu yöntem, kimlik bilgisi kimlikleri listesinin tamamını iletmeyi gerektirmez. Bu nedenle, belirli bir kullanıcının geçiş anahtarı sayısının açığa çıkmasını önlemek için kullanıcının kimliği doğrulanmadığında kullanılmalıdır.

Chrome'daki Google Şifre Yöneticisi'nden bir geçiş anahtarı silindiğinde görüntülenen iletişim kutusu.
Chrome'daki Google Şifre Yöneticisi'nden bir geçiş anahtarı silindiğinde görüntülenen iletişim kutusu.

Kayıtlı kimlik bilgilerinin listesini gönderme

// After a user deletes a passkey or a user is signed in.

// Feature detection
if (PublicKeyCredential.signalAllAcceptedCredentials) {
  await PublicKeyCredential.signalAllAcceptedCredentials({
    rpId: "example.com",
    userId: "M2YPl-KGnA8", // base64url encoded user ID
    allAcceptedCredentialIds: [ // A list of base64url encoded credential IDs
      "vI0qOggiE3OT01ZRWBYz5l4MEgU0c7PmAA",
      ...
    ]
  });
}

RP, PublicKeyCredential.signalAllAcceptedCredentials() işlevini bir RP kimliği, kullanıcı kimliği ve depolanan kimlik bilgilerinin kimlik bilgisi listesini belirterek çağırarak geçiş anahtarı sağlayıcıyı depolama alanındaki kalan kimlik bilgileri hakkında bilgilendirebilir. Bu sinyalin nasıl ele alınacağı geçiş anahtarı sağlayıcıya bağlıdır ancak kullanıcının oturum açarken ilişkili kimlik bilgisinin bulunmadığı geçiş anahtarlarını görmemesi için bu listeyle eşleşmeyen geçiş anahtarlarının kaldırılması beklenir.

Geçiş anahtarı sağlayıcının geçiş anahtarlarının senkronize bir listesini tutabilmesi için bu API, kullanıcı RP'de bir geçiş anahtarını sildiğinde ve her oturum açıldığında çağrılmalıdır.

Güncellenen kullanıcı adını ve görünen adı bildirme

// After a user updated their username and/or display name
// or a user is signed in.

// Feature detection
if (PublicKeyCredential.signalCurrentUserDetails) {
  await PublicKeyCredential.signalCurrentUserDetails({
    rpId: "example.com",
    userId: "M2YPl-KGnA8", // base64url encoded user ID
    name: "a.new.email.address@example.com", // username
    displayName: "J. Doe"
  });
} else {
}

RP, PublicKeyCredential.signalCurrentUserDetails()'yi bir RP kimliği, kullanıcı kimliği, kullanıcı adı ve görünen adla çağırarak geçiş anahtarı sağlayıcıyı güncellenen kullanıcı bilgileri hakkında bilgilendirebilir. Bu sinyalin nasıl ele alınacağı geçiş anahtarı sağlayıcıya bağlıdır ancak kullanıcının sahip olduğu geçiş anahtarlarının yeni kullanıcı bilgileriyle güncellenmesi beklenir.

Bu API, geçiş anahtarı sağlayıcının bu bilgileri sunucuda senkronize tutabilmesi için kullanıcı adı veya görünen ad güncellendiğinde ve her oturum açıldığında çağrılabilir.

Chrome'daki Google Şifre Yöneticisi'nde geçiş anahtarı meta verileri güncellendiğinde görüntülenen iletişim kutusu.
Chrome'daki Google Şifre Yöneticisi'nde geçiş anahtarı meta verileri güncellendiğinde görüntülenen iletişim kutusu.

Özet

Signal API, beklenmedik oturum açma hatalarının olasılığını ortadan kaldırarak daha iyi bir geçiş anahtarı deneyimi oluşturmanıza yardımcı olur. Signal API ile güvenen taraflar, mevcut kimlik bilgilerinin listesini ve meta verilerini göndererek geçiş anahtarı sağlayıcıdaki geçiş anahtarlarını senkronize tutabilir.

Geçiş anahtarları hakkında daha fazla bilgi edinmek için Geçiş anahtarlarıyla şifresiz giriş başlıklı makaleyi inceleyin.