WebAuthn ve geçiş anahtarı (passkey) uygulaması hakkında geliştirici kılavuzu. Kopya kağıdını PDF olarak indirin veya tüm bilgiler için bu web sitesini kullanın.
Lukas R.
Oluşturuldu: 6 Mart 2024
Güncellendi: 3 Temmuz 2026

Bu sayfa otomatik olarak çevrildi. Orijinal İngilizce sürümü buradan okuyun.
Geçiş Anahtarları Kopya Kağıdını ücretsiz indirin ve tüm bilgilere ulaşın.
Kapsamlı Geçiş Anahtarı Geliştirici Kılavuzu
Platform desteği, tarayıcı davranışı, UX en iyi uygulamaları ve entegrasyon ipuçlarını kapsayan, geçiş anahtarlarıyla ilgili her şey için geliştirici odaklı bir referans edinin.

Geçiş anahtarlarıyla kimlik doğrulama, kayıt (diğer adıyla attestation aşaması) ve giriş (diğer adıyla assertion aşaması) olmak üzere iki sürece (törenlere) dayanır.
Her aşama, sunucu tarafından oluşturulan, kimlik doğrulayıcı tarafından imzalanan ve kullanıcıyı doğrulamak için WebAuthn sunucusuna geri gönderilen rastgele bir challenge gerektirir.
Passkeys Debugger içinde passkey akışlarını deneyin.
Kayıt töreni iki ana nesne kullanır: PublicKeyCredentialCreationOptions ve attestation.
Giriş töreni iki ana nesne kullanır: PublicKeyCredentialRequestOptions ve assertion.
Kaç kişinin gerçekten passkeys kullandığını görün.
Geçiş anahtarlarıyla kayıt ve giriş için dört ana nesne vardır:
Bu bölüm ayrıca PublicKeyCredentialCreationOptions içinde kullanılan authenticatorSelection nesnesini de açıklamaktadır.
Igor Gjorgjioski
Head of Digital Channels & Platform Enablement, VicRoads
We hit 80% mobile passkey activation across 5M+ users without replacing our IDP.
See how VicRoads scaled passkeys to 5M+ users — alongside their existing IDP.
Read the case studyPublicKeyCredentialCreationOptions, attestation (Kayıt) aşamasının merkez nesnesidir. WebAuthn sunucusu tarafından oluşturulur ve döndürülür.
{ "PublicKeyCredentialCreationOptions": { "rp": { "id": "passkeys.eu", "name": "Corbado Passkeys Demo" }, "user": { "displayName": "john.doe", "id": "dXNyLZ….DU10Tc", "name": "john@doe.com" }, "challenge": "888fix4Bus...pHHr3Y", "pubKeyCredParams": [ { "alg": -7, "type": "public-key" }, { "alg": -257, "type": "public-key" } ], "excludeCredentials": [], "authenticatorSelection": { "authenticatorAttachment": "platform", "residentKey": "required", "userVerification": "required" }, "attestation": "none", "extensions": {} } }
Nesne şu nitelikleri içerir:
Son haberler için Passkeys Substack'e abone olun.
PublicKeyCredentialRequestOptions, assertion (Giriş) aşamasının merkez nesnesidir. WebAuthn sunucusu tarafından oluşturulur ve döndürülür.
{ "publicKeyCredentialRequestOptions": { "challenge": "pT7HMA-…dFPHk", "timeout": 500, "rpId": "passkeys.eu", "userVerification": "preferred", "allowCredentials": [], "extensions": [] } }
Nesne şu nitelikleri içerir:
Attestation / Kayıt Töreni sırasında, Kimlik Doğrulayıcı bu Kayıt Yanıtını döndürür. Bunu Geçiş Anahtarı Hata Ayıklayıcı (Passkeys Debugger) üzerinden kendiniz de deneyebilirsiniz.
{ "authenticatorAttachment": "platform", "id": "JKZbixUfKN_aZtimefYT-OjH5dw", "rawId": "JKZbixUfKN_aZtimefYT-OjH5dw", "response": { "attestationObject": { "fmt": "none", "attStmt": {}, "authData": { "rpIdHash": "PpZrl-Wqt-OFfBpyy2SraN1m7LT0GZORwGA7-6ujYkM", "flags": { "userPresent": true, "userVerified": true, "backupEligible": true, "backupStatus": true, "attestedData": true, "extensionData": false }, "counter": 0, "aaguid": { "raw": "fbfc3007-154e-4ecc-8c0b-6e020557d7bd", "name": "iCloud Keychain" }, "credentialID": "JKZbixUfKN_aZtimefYT-OjH5dw", "credentialPublicKey": "pQECAyYgASFYIPWLalDzyxIDmAADvfK8iNM5To50kh7TyPH-teEz8RMdIlgg3D7bPIWQJ8z-WFn3zdYZzJw9c7mhPdmflQqD9vV7efA", "parsedCredentialPublicKey": { "keyType": "EC2 (2)", "algorithm": "ES256 (-7)", "curve": 1, "x": "9YtqUPPLEgOYAAO98ryI0zlOjnSSHtPI8f614TPxEx0", "y": "3D7bPIWQJ8z-WFn3zdYZzJw9c7mhPdmflQqD9vV7efA" } } }, "clientDataJSON": { "type": "webauthn.create", "challenge": "k2p6f-upzP_hc6NZvmMAxiI0VSTeQIeXXVRGW62LTj0", "origin": "https://www.passkeys-debugger.io", "crossOrigin": false }, "transports": ["hybrid", "internal"], "authenticatorData": "PpZrl-Wqt-OFfBpyy2SraN1m7LT0GZORwGA7-6ujYkNdAAAAAPv8MAcVTk7MjAtuAgVX170AFCSmW4sVHyjf2mbYpnn2E_jox-XcpQECAyYgASFYIPWLalDzyxIDmAADvfK8iNM5To50kh7TyPH-teEz8RMdIlgg3D7bPIWQJ8z-WFn3zdYZzJw9c7mhPdmflQqD9vV7efA", "publicKey": "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE9YtqUPPLEgOYAAO98ryI0zlOjnSSHtPI8f614TPxEx3cPts8hZAnzP5YWffN1hnMnD1zuaE92Z-VCoP29Xt58A", "publicKeyAlgorithm": -7 }, "type": "public-key", "clientExtensionResults": {} }
attestation, attestationObject, algorithm ve transport bayrakları gibi bazı önemli bileşenler içerir.
W3C'nin Webauthn spesifikasyonundan alınmıştır
attestationObject, yeni oluşturulan kimlik bilgileri, ortak anahtar (public key) ve diğer ilgili veriler hakkında bilgi içeren CBOR kodlu bir nesnedir:
Uzantılar (extensions) hakkında daha fazla bilgi edinin.
Geçiş anahtarları, attestation nesnesindeki parsedCredentialPublicKey'in algorithm niteliğinde kullanılan algoritmayı belirten COSE algoritmaları ile oluşturulur.
İşte en ilgili COSE algoritmalarına bir genel bakış:
transports özelliği, bir kimlik doğrulayıcının bir istemciyle iletişim kurabileceği mekanizmaları gösterir. Bazı yaygın, örnek değer kombinasyonları şunlardır:
Assertion / Giriş Töreni sırasında, Kimlik Doğrulayıcı bu Giriş Yanıtını döndürür. Bunu Geçiş Anahtarı Hata Ayıklayıcı (Passkeys Debugger) üzerinden kendiniz de deneyebilirsiniz.
{ "id": "JKZbixUfKN_aZtimefYT-OjH5dw", "rawId": "JKZbixUfKN_aZtimefYT-OjH5dw", "type": "public-key", "authenticatorAttachment": "platform", "response": { "authenticatorData": { "rpIdHash": "PpZrl-Wqt-OFfBpyy2SraN1m7LT0GZORwGA7-6ujYkM", "flags": { "userPresent": true, "userVerified": true, "backupEligible": true, "backupStatus": true, "attestedData": false, "extensionData": false }, "counter": 0 }, "clientDataJSON": { "type": "webauthn.get", "challenge": "GCVkITWbe2l2dttsn_DgJYvH9QPHPDo0ygWgcgI6B7U", "origin": "https://www.passkeys-debugger.io", "crossOrigin": false, "other_keys_can_be_added_here": "do not compare clientDataJSON against a template. See https://goo.gl/yabPex" }, "signature": "MEQCIA-orC8N2KKWOxyY17BWP8lB-Be5to9btXRnJZf2SLhXAiBGxJe5Eu5LwOTbsyzAYmIXHOhlC3pN7s7Q1fRLvEW57g", "userHandle": "_FKz1uwqmR_3yGq6hJntzoIFwFC_d1u_53YRELh0KlE" } }
assertion, bayraklar, imza ve userHandle gibi bazı önemli bileşenleri içerir.
İşte en ilgili bayraklara ve bunların kombinasyonlarına bir genel bakış:
signature (imza), giriş yapmaya çalışan kullanıcının gerçekten özel anahtara sahip olduğunu doğrulamak için kullanılır. İmza, authenticatorData ve clientDataHash'in (yani ClientDataJSON'ın SHA-256 sürümü) birleştirilmesi ve sonucun özel anahtarla (kimlik doğrulayıcıda) imzalanmasıyla oluşturulur. Ortak anahtarla doğrulamak için, aynı şekilde authenticatorData ve clientDataHash'i birleştiririz. Doğrulama sonucu true dönerse, kimlik doğrulama başarılıdır.
userHandle gerçek user_id'dir. user_id hakkında daha fazla bilgiyi 4.1 Veritabanı Şeması bölümünde okuyabilirsiniz.
authenticatorSelection nesnesi, sunucunun kimlik doğrulayıcı ve kimlik bilgisi oluşturma için aşağıdaki değerlerle ayarları dikte etmesine olanak tanır:
Resident Keys (Keşfedilebilir Kimlik Bilgisi olarak da adlandırılır): Resident key'ler (yerleşik anahtarlar) kimlik doğrulayıcıda depolanır ve kimlik doğrulama sırasında alınır. Bu sayede istemci olası anahtarların bir listesini keşfedebilir, bu nedenle [Conditional UI](/blog/user-transition-passkeys-> conditional-ui) resident key'ler gerektirir. Non-Resident Keys (Keşfedilemeyen Kimlik Bilgisi olarak da adlandırılır): Non-resident key'ler söz konusu olduğunda, kimlik bilgisi kimliği (credential ID) sunucuda depolanır ve kimlik doğrulama sırasında sağlanır. Kimlik bilgisi kimliği, iç yapısı uygulamaya özgü olan opak bir tanımlayıcıdır; kimlik doğrulayıcılar özel anahtarları doğrudan depolayabilir, şifrelenmiş anahtar sarma kullanabilir veya dahili sırlardan anahtarlar türetebilir. Kesin mekanizma kimlik doğrulayıcı uygulamasına göre değişir.
Uyarı: "Preferred" olarak ayarlanırsa, kullanıcı veya cihazı kimlik doğrulama sürecinde kullanıcı doğrulamasını atlayabilir (daha fazlasını bu makalede okuyun).
Conditional UI (geçiş anahtarı otomatik doldurma), bir kullanıcının Relying Party'ye kayıtlı bir resident key'i olduğunda, mevcut geçiş anahtarlarını kullanıcı için bir seçim açılır menüsünde görüntüler. Geçiş anahtarlarının kullanılabilirliğini artırır, ancak ek geliştirme çabaları gerektirir ve tüm işletim sistemi / tarayıcı kombinasyonları için mevcut değildir.
Normal bir giriş gibi, Conditional UI da PublicKeyCredentialRequestOptions ve assertion nesnelerini kullanır
Conditional UI, işletim sistemleri ve tarayıcıların tüm kombinasyonlarında (henüz) mevcut değildir. İşte mevcut tarayıcı kapsamına bir genel bakış (Mart 2024):
Güncel bir genel bakış için bu web sitesine bakın.
Bir Conditional UI yöntemi için tam, minimalist bir kod şu şekildedir:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Conditional UI</title> </head> <body> <input type="text" id="username" autocomplete="username webauthn" /> <script> async function passkeyLogin() { try { // retrieve the request options (incl. the challenge) from the WebAuthn server let options = await WebAuthnClient.getPublicKeyRequestOptions(); const credential = await navigator.credentials.get({ publicKey: options.publicKeyCredentialRequestOptions, mediation: "conditional", }); const userData = await WebAuthnClient.sendSignedChallenge(credential); window.location.href = "/logged-in"; } catch (error) { console.log(error); } } passkeyLogin(); </script> </body> </html>
Conditional UI yalnızca resident keys / keşfedilebilir kimlik bilgileriyle çalışır
Conditional UI girişini başlatmak için farklı bir sunucu uç noktası sağlanması önerilir.
İstemcinin birden fazla gereksinimi karşılaması gerekir:
Hataları önlemek için, sunucu ilk olarak bu işlevle istemcilerin kullanılabilirliğini test etmelidir:
Gerçek trafikte, tespit ve yaşam döngüsü sorunları genellikle
NotAllowedError veya AbortError olarak ortaya çıkar. Yerel Credential Manager geçiş anahtarı hataları dahil olmak üzere, beklenen ve beklenmeyen sınıflandırması için bu WebAuthn hataları kılavuzunu kullanın.
// source: https://developer.mozilla.org/en-US/docs/Web/API/PublicKeyCredential/isConditionalMediationAvailable#examples // 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 start endpoint let options = await WebAuthnClient.getPublicKeyRequestOptions(); const credential = await navigator.credentials.get({ publicKey: options.publicKeyCredentialRequestOptions, mediation: "conditional", }); /* ... */ } }
Giriş alanı, istemciye geçiş anahtarlarını devam eden isteğe doldurmasını işaret eden bir HTML otomatik doldurma token'ı almalıdır. Geçiş anahtarlarına ek olarak, otomatik doldurma token'ları, kullanıcı adları ve şifreler gibi mevcut token'larla eşleştirilebilir:
<label for="name">Username:</label> <input type="text" name="name" autocomplete="username webauthn" /> <label for="password">Password:</label> <input type="password" name="password" autocomplete="current-password webauthn" />
WebAuthn sunucuları için zorunlu veya standartlaştırılmış bir veritabanı şeması yoktur. Ancak, bu örnek veritabanı şeması, gerekli bilgileri depolamak ve bir WebAuthn sunucusunun tüm işlevlerini sağlamak için kullanılabilir:
Kalın yazılmış nitelikler, minimum uygulanabilir bir gerçekleştirim için zorunluyken, diğerleri yalnızca isteğe bağlı ancak faydalı özellikler için gereklidir.
Kullanıcı Görünen Adı (user.displayName): Genellikle kullanıcının tam adı olan kullanıcı dostu, okunabilir ad. Kullanıcıya gösterilir, ancak kimlik doğrulama sırasında kullanılmaz.
Kullanıcı Adı (user.name): Genellikle bir e-posta adresi veya bir kullanıcı adı olan benzersiz ve okunabilir ad. Kullanıcıya gösterilebilir, ancak kimlik doğrulama sırasında kullanılmaz.
Relying Party ID (rpID), geçiş anahtarında depolanan ve geçiş anahtarının yalnızca doğru alan (tarayıcı URL'si, yerel uygulamalar için bu makaleye bakın) için çalışmasını sağlayan bir alandır (domain). Kimlik doğrulama sırasında rpID, tarayıcı URL'sine karşı kontrol edilir ve yalnızca şu iki durumda izin verilir:
İşte izin verilen ve verilmeyen kombinasyonlar için örnekler:
Geçiş anahtarlarını uygulamak için kullanışlı araçların ve web sitelerinin bir listesi aşağıdadır.
chrome://device-log aracılığıyla Chrome'da mevcuttur)Geçiş anahtarı UX'inizi teknik uygulamanın ötesinde optimize etmeye yönelik stratejiler için, geçiş anahtarı oluşturma en iyi uygulamaları ve geçiş anahtarı girişi en iyi uygulamaları kılavuzlarımıza bakın.
Herhangi bir uygulamaya sadece birkaç satır kodla geçiş anahtarları uygulamak istiyorsanız, Corbado Complete (yeni uygulamalar için) veya Corbado Connect (mevcut uygulamalar için) de kullanabilirsiniz.
Corbado, büyük ölçekte tüketici kimlik doğrulaması yöneten CIAM ekipleri için Authentication Intelligence Platform'tur. IDP loglarının ve genel analytics araçlarının göremediğini görmenizi sağlarız: hangi cihazların, OS sürümlerinin, tarayıcıların ve credential manager'ların passkey desteklediğini; kayıtların neden girişe dönüşmediğini; WebAuthn akışının nerede başarısız olduğunu; bir OS ya da tarayıcı güncellemesinin girişi sessizce ne zaman bozduğunu — hem de Okta, Auth0, Ping, Cognito veya kendi IDP'nizi değiştirmeden. İki ürün: Corbado Observe, passkey'ler ve diğer tüm giriş yöntemleri için observability sağlar. Corbado Connect, analytics entegre managed passkey'ler sunar (IDP'nizin yanında). VicRoads, Corbado ile 5M+ kullanıcı için passkey çalıştırıyor (%80+ passkey aktivasyonu). Bir Passkey uzmanıyla görüşün →
Conditional UI, kimlik doğrulamayı başlatmadan önce PublicKeyCredential.isConditionalMediationAvailable() aracılığıyla tarayıcı desteğini kontrol etmeyi gerektirir. Giriş alanı autocomplete="username webauthn" HTML token'ını içermeli ve kullanıcının kayıtlı bir resident key'i (keşfedilebilir kimlik bilgisi) olmalıdır. Conditional UI giriş akışını işlemek için ayrı bir sunucu uç noktası önerilir.
En azından, kayıt sırasında kimlik doğrulayıcı tarafından oluşturulan Kimlik Bilgisi Kimliği (Credential ID) ile assertion nesnesinde userHandle olarak döndürülen Kullanıcı Kimliğini (user_id) saklayın. İlgili kullanıcı hesabını aramak için Kimlik Bilgisi Kimliğini kullanın ve kimlik doğrulamasını doğrulamak için userHandle'ı karşılaştırın. Zaman içinde değişebileceğinden, karşılaştırma için user.name kullanmaktan kaçının.
Resident key'ler (keşfedilebilir kimlik bilgileri) doğrudan kimlik doğrulayıcının üzerinde saklanır ve kimlik doğrulama sırasında alınır; bu, Conditional UI'nin çalışması için gereklidir. Non-resident key'ler ise kimlik bilgisi kimliğini sunucuda depolar ve kimlik doğrulama sırasında kimlik doğrulayıcıya gönderir. authenticatorSelection içindeki residentKey alanı bu davranışı "required", "preferred" veya "discouraged" değerleriyle kontrol eder.
userVerification alanı, kimlik doğrulayıcının oturum açma sırasında kullanıcıyı doğrulamasının gerekip gerekmediğini kontrol eder ve "required", "preferred" (varsayılan) veya "discouraged" değerlerini kabul eder. "preferred" olarak ayarlandığında, kullanıcı veya cihazı, kimlik doğrulama işlemi sırasında doğrulamayı tamamen atlayabilir ve potansiyel olarak güvenliği zayıflatabilir. "required" olarak ayarlamak, kimlik doğrulama tamamlanmadan önce doğrulamanın her zaman gerçekleşmesini sağlar.
Corbado’nun passkey geçiş sürecinize ve mevcut authentication stack’inize nasıl uyduğunu görün.
Console’u keşfet
İlgili makaleler
İçindekiler