Geçiş anahtarlarından yararlanan ve mevcut şifre kullanıcılarını kapsayacak bir oturum açma deneyimi oluşturun.
Geçiş anahtarları şifrelerin yerini alır ve web'deki kullanıcı hesaplarını daha güvenli, basit ve kullanımı kolay hale getirir. Ancak şifre tabanlı kimlik doğrulamadan geçiş anahtarı tabanlı kimlik doğrulamasına geçiş, kullanıcı deneyimini karmaşık hale getirebilir. Şifre anahtarları önermek için form otomatik doldurma özelliğini kullanmak, birleşik bir deneyim oluşturmanıza yardımcı olabilir.
Geçiş anahtarıyla oturum açmak için neden form otomatik doldurma özelliğini kullanmalısınız?
Geçiş anahtarı sayesinde kullanıcılar yalnızca parmak izi, yüz veya cihaz PIN'ini kullanarak web sitelerinde oturum açabilir.
İdeal olarak, şifre kullanan kullanıcı olmamalı ve kimlik doğrulama akışı tek bir oturum açma düğmesi kadar basit olabilir. Kullanıcı düğmeye dokunduğunda bir hesap seçici iletişim kutusu açılır. Kullanıcı, bir hesap seçebilir, doğrulama ve oturum açma için ekranın kilidini açabilir.
Ancak şifre tabanlı kimlik doğrulamadan geçiş anahtarı tabanlı kimlik doğrulamasına geçiş zor olabilir. Kullanıcılar geçiş anahtarlarına geçiş yaparken şifre kullananlar da olacaktır. Bu nedenle, web sitelerinin her iki kullanıcı türünü de desteklemesi gerekir. Kullanıcıların hangi sitelerde geçiş anahtarlarına geçiş yaptıklarını hatırlamaları beklenmemelidir. Bu nedenle kullanıcılardan hangi yöntemi kullanacaklarını en baştan seçmelerini istemek kötü bir kullanıcı deneyimi olacaktır.
Geçiş anahtarları da yeni bir teknolojidir. Bu özellikleri açıklamak ve kullanıcıların bunları rahatça kullanabildiğinden emin olmak web siteleri için zor olabilir. Her iki sorunu da çözmek için şifrelerin otomatik olarak doldurulmasıyla ilgili tanıdık kullanıcı deneyimlerine güvenebiliriz.
Koşullu kullanıcı arayüzü
Hem geçiş anahtarı hem de şifre kullanıcıları için verimli bir kullanıcı deneyimi oluşturmak amacıyla geçiş anahtarlarını otomatik doldurma önerilerine dahil edebilirsiniz. Buna koşullu kullanıcı arayüzü denir ve WebAuthn standardının bir parçasıdır.
Kullanıcı, kullanıcı adı giriş alanına dokunduğunda, depolanan geçiş anahtarlarını ve şifre otomatik doldurma önerilerini vurgulayan bir otomatik doldurma önerisi iletişim kutusu açılır. Kullanıcı daha sonra bir hesap seçip cihaz ekran kilidini kullanarak oturum açabilir.
Bu sayede kullanıcılar, hiçbir şey değişmemiş gibi mevcut formla web sitenizde oturum açabilir ancak geçiş anahtarlarının ek güvenlik avantajından yararlanabilir.
İşleyiş şekli
Geçiş anahtarıyla kimlik doğrulamak için WebAuthn API'yi kullanırsınız.
Geçiş anahtarı kimlik doğrulama akışının dört bileşeni şunlardır: kullanıcı:
- Arka uç: Ortak anahtarı ve geçiş anahtarıyla ilgili diğer meta verileri depolayan hesap veritabanını barındıran arka uç sunucunuz.
- Ön uç: Tarayıcıyla iletişim kuran ve getirme isteklerini arka uca gönderen ön ucunuz.
- Tarayıcı: JavaScript'inizi çalıştıran kullanıcının tarayıcısı.
- Authenticator: Kullanıcının geçiş anahtarını oluşturup depolayan kimlik doğrulayıcısı. Bu, tarayıcıyla aynı cihazda (ör. Windows Hello'yu kullanırken) veya telefon gibi başka bir cihazda olabilir.
- Kullanıcı ön uçta oturum açtığı anda, geçiş anahtarıyla kimlik doğrulaması yapmak için arka uçtan istek alır ve geçiş anahtarıyla kimlik doğrulamayı başlatmak için
navigator.credentials.get()
'ü çağırır. Bu işlem birPromise
döndürür. - Kullanıcı imleci oturum açma alanına yerleştirdiğinde tarayıcı, şifre anahtarlarını içeren bir şifre otomatik doldurma iletişim kutusu görüntüler. Kullanıcı geçiş anahtarı seçerse bir kimlik doğrulama iletişim kutusu gösterilir.
- Kullanıcı, cihazın ekran kilidini kullanarak kimliğini doğruladıktan sonra söz çözülür ve ön uçta bir genel anahtar kimlik bilgisi döndürülür.
- Ön uç, ortak anahtar kimlik bilgisini arka uca gönderir. Arka uç, veritabanındaki eşleşen hesabın ortak anahtarıyla karşılaştırarak imzayı doğrular. İşlem başarılı olursa kullanıcı oturum açar.
Otomatik form doldurma aracılığıyla geçiş anahtarıyla kimlik doğrulayın
Kullanıcı oturum açmak istediğinde, geçiş anahtarlarının otomatik doldurma önerilerine dahil edilebileceğini belirtmek için koşullu bir WebAuthn get
çağrısı yapabilirsiniz. WebAuthn'ın navigator.credentials.get()
API'sine yapılan koşullu çağrı, kullanıcı otomatik doldurma önerilerinden oturum açacağı hesabı seçene kadar kullanıcı arayüzü göstermez ve beklemede kalır. Kullanıcı bir geçiş anahtarı seçerse tarayıcı, oturum açma formunu doldurmak yerine taahhüdünü bir kimlik bilgisi ile çözer. Ardından, kullanıcının oturum açması sayfanın sorumluluğundadır.
Form giriş alanına not ekleyin
Gerekirse kullanıcı adı input
alanına autocomplete
özelliği ekleyin.
Geçiş anahtarı önermesi için jeton olarak username
ve webauthn
öğelerini ekleyin.
<input type="text" name="username" autocomplete="username webauthn" ...>
Özellik algılama
Koşullu WebAuthn API çağrısı başlatmadan önce şunları kontrol edin:
- Tarayıcı,
PublicKeyCredential
ile WebAuthn'u desteklemelidir.
- Tarayıcı,
PublicKeyCredenital.isConditionalMediationAvailable()
ile WebAuthn koşullu kullanıcı arayüzünü destekler.
// Availability of `window.PublicKeyCredential` means WebAuthn is usable.
if (window.PublicKeyCredential &&
PublicKeyCredential.isConditionalMediationAvailable) {
// Check if conditional mediation is available.
const isCMA = await PublicKeyCredential.isConditionalMediationAvailable();
if (isCMA) {
// Call WebAuthn authentication
}
}
RP sunucusundan istem getirme
Kısıtlanmış taraf sunucusundan navigator.credentials.get()
numaralı telefonu çağırmak için gereken bir sorgulamayı getir:
challenge
: ArrayBuffer'da sunucu tarafından oluşturulan bir sorgulama. Bu, yeniden oynatma saldırılarını önlemek için gereklidir. Her oturum açma denemesinde yeni bir istem oluşturduğunuzdan ve belirli bir sürenin ardından veya oturum açma denemesi doğrulanamadığında bu isteği yoksayıp yoksaymadığınızdan emin olun. Bunu bir CSRF jetonu olarak düşünebilirsiniz.allowCredentials
: Bu kimlik doğrulama için kabul edilebilir kimlik bilgileri dizisi. Kullanıcının tarayıcı tarafından gösterilen bir listeden kullanılabilir bir geçiş anahtarı seçmesine izin vermek için boş bir dizi iletin.userVerification
: Cihaz ekran kilidini kullanarak doğrulama işleminin"required"
,"preferred"
veya"discouraged"
arasından hangisi olduğunu belirtir. Varsayılan değer"preferred"
'tür. Bu, kimlik doğrulayıcının kullanıcı doğrulamasını atlayabileceği anlamına gelir. Bu değeri"preferred"
olarak ayarlayın veya mülkü çıkarın.
Kullanıcının kimliğini doğrulamak için WebAuthn API'yi conditional
işaretiyle çağırma
Kullanıcı kimlik doğrulamasını beklemeye başlamak için navigator.credentials.get()
numaralı telefonu arayın.
// To abort a WebAuthn call, instantiate an `AbortController`.
const abortController = new AbortController();
const publicKeyCredentialRequestOptions = {
// Server generated challenge
challenge: ****,
// The same RP ID as used during registration
rpId: 'example.com',
};
const credential = await navigator.credentials.get({
publicKey: publicKeyCredentialRequestOptions,
signal: abortController.signal,
// Specify 'conditional' to activate conditional UI
mediation: 'conditional'
});
rpId
: RP kimliği bir alandır ve web siteleri kendi alanlarını veya kaydedilebilir bir son eki belirtebilir. Bu değer, geçiş anahtarı oluşturulurken kullanılan rp.id ile eşleşmelidir.
İsteği koşullu hale getirmek için mediation: 'conditional'
değerini belirtmeyi unutmayın.
Döndürülen ortak anahtar kimlik bilgisini RP sunucusuna gönder
Kullanıcı bir hesap seçip cihazın ekran kilidini kullanmaya izin verdikten sonra, söz çözülür ve RP ön ucuna bir PublicKeyCredential
nesnesi döndürülür.
Bir vaat birkaç farklı nedenden dolayı reddedilebilir. Hataları, Error
nesnesinin name
özelliğine bağlı olarak uygun şekilde ele almanız gerekir:
NotAllowedError
: Kullanıcı işlemi iptal etti.- Diğer istisnalar: Beklenmeyen bir hata oluştu. Tarayıcı, kullanıcıya bir hata iletişim kutusu gösterir.
Ortak anahtar kimlik bilgisi nesnesi aşağıdaki özellikleri içerir:
id
: Kimliği doğrulanmış geçiş anahtarı kimlik bilgisinin base64url kodlanmış kimliği.rawId
: Kimlik bilgisi kimliğinin ArrayBuffer sürümü.response.clientDataJSON
: Müşteri verilerinden oluşan bir ArrayBuffer. Bu alanda, kısıtlanmış taraf ve kısıtlanmış taraf sunucusunun doğrulaması gereken kaynak gibi bilgiler yer alır.response.authenticatorData
: Kimlik doğrulayıcı verilerinin ArrayBuffer'ı. Bu alan, RP kimliği gibi bilgileri içerir.response.signature
: İmzanın ArrayBuffer'ı. Bu değer, kimlik bilgisinin çekirdeğidir ve sunucuda doğrulanması gerekir.response.userHandle
: Oluşturma sırasında ayarlanan kullanıcı kimliğini içeren bir ArrayBuffer. Sunucunun kullandığı kimlik değerlerini seçmesi gerekiyorsa veya arka uç, kimlik kimlikleri üzerinde dizin oluşturmaktan kaçınmak istiyorsa bu değer, kimlik bilgisi kimliği yerine kullanılabilir.authenticatorAttachment
: Bu kimlik bilgisi yerel cihazdan geldiğindeplatform
döndürülür. Aksi takdirdecross-platform
, özellikle de kullanıcı oturum açmak için telefon kullandığında. Kullanıcının oturum açmak için telefon kullanması gerekiyorsa yerel cihazda geçiş anahtarı oluşturmasını isteyebilirsiniz.type
: Bu alan her zaman"public-key"
olarak ayarlanır.
RP sunucusunda ortak anahtar kimlik bilgisi nesnesini işlemek için bir kitaplık kullanıyorsanız nesnenin tamamını, base64url ile kısmen kodladıktan sonra sunucuya göndermenizi öneririz.
İmzayı doğrulayın
Sunucuda ortak anahtar kimlik bilgisini aldığınızda nesneyi işlemek için FIDO kitaplığına iletin.
id
özelliğiyle eşleşen kimlik bilgisi kimliğini arayın (Kullanıcı hesabını belirlemeniz gerekiyorsa kimlik bilgisini oluştururken belirttiğiniz user.id
olan userHandle
özelliğini kullanın). Kimlik bilgisinin signature
değerinin, depolanan ortak anahtarla doğrulanıp doğrulanamayacağına bakın. Bunu yapmak için kendi kodunuzu yazmak yerine sunucu tarafı bir kitaplık veya çözüm kullanmanızı öneririz. Açık kaynak kitaplıklarını awesome-webauth GitHub deposunda bulabilirsiniz.
Kimlik bilgisi eşleşen bir ortak anahtarla doğrulandıktan sonra kullanıcının oturum açmasını sağlayın.
Sunucu tarafı geçiş anahtarı kimlik doğrulaması başlıklı makaledeki daha ayrıntılı talimatları uygulayın.