---
url: 'https://www.corbado.com/tr/blog/gecis-anahtari-kopya-kagidi'
title: 'Geliştiriciler için Geçiş Anahtarları Kopya Kağıdı'
description: '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.'
lang: 'tr'
author: 'Lukas R.'
date: '2026-07-03T07:12:31.334Z'
lastModified: '2026-07-03T07:12:55.069Z'
keywords: 'geçiş anahtarı, passkey, kopya kağıdı, cheat sheet, webauthn, geliştirici kılavuzu'
category: 'Passkeys Implementation'
---

# Geliştiriciler için Geçiş Anahtarları Kopya Kağıdı

## Buradan ücretsiz indirin

**Geçiş Anahtarları Kopya Kağıdını ücretsiz** indirin ve tüm bilgilere ulaşın.

- ✅ Şimdiden +4.000 indirme
- ✅ Ally, Kmart, Octopus [Energy](https://www.corbado.com/passkeys-for-energy) ve Stanford CS'teki geliştirici ekipleri tarafından talep edildi
- ✅ Pazarlama saçmalıkları yok - sadece teknik içgörüler

## Key Facts

- Geçiş anahtarları ile kimlik doğrulama iki **tören** (ceremony) kullanır: kayıt (attestation) ve giriş (assertion). Her ikisi de kimlik doğrulayıcı tarafından imzalanmış, sunucu tarafından oluşturulan rastgele bir challenge (meydan okuma) gerektirir.
- **PublicKeyCredentialCreationOptions** geçiş anahtarı kaydını yönetirken, **PublicKeyCredentialRequestOptions** girişi yönetir. Her iki nesne de sunucu tarafında oluşturulur ve kimlik doğrulayıcının imzalaması için challenge'ı içerir.
- **Conditional UI** (Koşullu Kullanıcı Arayüzü), mevcut geçiş anahtarlarını otomatik doldurma önerileri olarak görüntüler ancak keşfedilebilir kimlik bilgileri (resident keys) gerektirir ve tüm işletim sistemi ile tarayıcı kombinasyonlarında desteklenmez.
- **Relying Party ID (rpID)**, bir geçiş anahtarını bir alana (domain) bağlar: kimlik doğrulama yalnızca URL tam olarak eşleştiğinde veya rpID'nin public-suffix olmayan bir alt alan adı olduğunda başarılı olur.
- Geçiş anahtarları, anahtar oluşturmak için **COSE algoritmaları** kullanır ve kullanılan belirli algoritma, attestation nesnesinin parsedCredentialPublicKey niteliğine kaydedilir.

## 1. WebAuthn Törenleri (Ceremonies)

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.

### 1.1 Kayıt (Attestation)

![WebAuthn'de kayıt töreninin süreç akışı](https://www.corbado.com/website-assets/65fad0076e7b4367976ee993_cs_1_1_registration_flow_min_26eb12d652.png)_Kayıt töreni iki ana nesne kullanır: PublicKeyCredentialCreationOptions ve attestation._

[Watch on YouTube](https://www.youtube.com/watch?v=0hRYXHESA24)

### 1.2 Giriş (Assertion)

![WebAuthn'de giriş töreninin süreç akışı](https://www.corbado.com/website-assets/65fad0f2e412e9ad9d2a5bf1_cs_1_2_login_flow_min_2aaefc04dd.png)_Giriş töreni iki ana nesne kullanır: PublicKeyCredentialRequestOptions ve assertion._

## 2. Önemli Nesneler

Geçiş anahtarlarıyla kayıt ve giriş için dört ana nesne vardır:

- PublicKeyCredentialCreationOptions
- PublicKeyCredentialRequestOptions
- attestation
- assertion

Bu bölüm ayrıca PublicKeyCredentialCreationOptions içinde kullanılan authenticatorSelection nesnesini de açıklamaktadır.

### 2.1 Public Key Credential Creation Options

PublicKeyCredentialCreationOptions, attestation (Kayıt) aşamasının merkez nesnesidir. [WebAuthn sunucusu](#webauthn-server) tarafından oluşturulur ve döndürülür.

```json
{
    "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:

- **rp:** Relying Party'yi (= kullanıcının kimliğini doğrulamak isteyen sunucu) tanımlar, [4.2 Relying Party ID (rpID)](#relying-party-id) bölümüne bakın.
- **user:** Attestation talep eden kullanıcı hesabı hakkında veri içerir. ID, kişisel bilgi içermemesi gereken, Relying Party tarafından seçilen bir bayt dizisidir. Bunun yerine kullanıcı adı veya e-posta adresi name veya displayName niteliğine kaydedilir. Bunun hakkında daha fazlasını [4.1 Veritabanı Şeması](#database-schema) bölümünde okuyun.
- **challenge:** Kimlik doğrulayıcı tarafından imzalanması gereken, rastgele oluşturulmuş base64URL kodlu BufferSource.
- **pubKeyCredParams:** Oluşturulacak kimlik bilgisinin belirtilmiş nitelikleri, genellikle desteklenen algoritma(lar).
- **timeout:** İstemcinin çağrının tamamlanmasını beklemesi için milisaniye cinsinden isteğe bağlı süre.
- **excludeCredentials:** Bir cihazda birden fazla geçiş anahtarı oluşturulmasını sınırlamak için isteğe bağlı kimlik bilgileri listesi.
- **authenticatorSelection:** Yöntem için kullanılan kimlik doğrulayıcının isteğe bağlı seçimi, örn. bir residentKey'in gerekli olup olmadığı. [2.5 authenticatorSelection](#authenticatorSelection) bölümüne bakın.
- **attestation:** Attestation nesnesinin belirli bir biçimde Relying Party'ye geçirilmesini talep etmek için kullanılabilir. Olası değerler none (varsayılan), indirect, direct ve enterprise'dır.
- **extensions:** Belirli dönüş değerleri gibi ek işlemler için isteğe bağlı istek(ler). Örn.
    - _credProbs_ oluşturulan kimlik bilgisinin keşfedilebilir olup olmadığı hakkında bilgi ister
    - _prf_, Relying Party'nin bir kimlik bilgisiyle ilişkili sözde rastgele işlevden (PRF) gelen çıktıları kullanmasına olanak tanır

### 2.2 Public Key Credential Request Options

PublicKeyCredentialRequestOptions, assertion (Giriş) aşamasının merkez nesnesidir. [WebAuthn sunucusu](#webauthn-server) tarafından oluşturulur ve döndürülür.

```json
{
    "publicKeyCredentialRequestOptions": {
        "challenge": "pT7HMA-…dFPHk",
        "timeout": 500,
        "rpId": "passkeys.eu",
        "userVerification": "preferred",
        "allowCredentials": [],
        "extensions": []
    }
}
```

Nesne şu nitelikleri içerir:

- **challenge, timeout, extensions:** [yukarıya](#creationoptions) bakın.
- **rpId:** Assertion isteği için Relying Party'nin tanımlayıcısı, [4.2 Relying Party ID (rpID)](#relying-party-id) bölümüne bakın.
- **allowCredentials:** Arayanın tercihini azalan sırada belirten, kimlik doğrulama için izin verilen isteğe bağlı kimlik bilgileri listesi. Bu liste PublicKeyCredentialDescriptors ile doldurulur.
- **userVerification:** İşlem sırasında kullanıcı doğrulama gereksinimlerini belirtmek için isteğe bağlı değer. Olası değerler preferred (varsayılan), required veya discouraged'dır.

### 2.3 Attestation

**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ı](https://www.passkeys-debugger.io/) (Passkeys Debugger) üzerinden kendiniz de deneyebilirsiniz.

```json
{
    "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](#attestationObject), [algorithm](#algorithm) ve [transport](#transport) bayrakları gibi bazı önemli bileşenler içerir.

#### 2.3.1 attestationObject

![attestationObject, WebAuthn'de attestation'ın bir parçasıdır](https://www.corbado.com/website-assets/65fad76914987b84f3ecf4cd_cs_2_3_attestation_Object_min_12a3b9e5cc.png)

[W3C'nin Webauthn spesifikasyonundan](https://www.w3.org/TR/webauthn-2/#attestation-object) 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:

- **fmt** geçiş anahtarları için genellikle "none" olarak değerlendirilir
- **attStmt** geçiş anahtarları için boştur ve diğer kimlik doğrulayıcılar, örn. donanım güvenlik anahtarı için doldurulur
- **authData**, aşağıdaki verileri içeren bir değer arabelleğidir:

![authData, örn. bayraklar, sayaçlar ve eklentiler içeren bir değer arabelleğidir](https://www.corbado.com/website-assets/65fc7c70babae11893e3e1e1_cs_2_3_auth_Data_min_7a7d39d083.png)

[Uzantılar (extensions)](https://developer.mozilla.org/en-US/docs/Web/API/Web_Authentication_API/WebAuthn_extensions) hakkında daha fazla bilgi edinin.

#### algorithm

Geçiş anahtarları, [attestation nesnesindeki](#attestation) parsedCredentialPublicKey'in **algorithm niteliğinde** kullanılan algoritmayı belirten **COSE algoritmaları** ile oluşturulur.\
İşte en ilgili COSE algoritmalarına bir genel bakış:

![Geçiş anahtarları COSE algoritmalarıyla oluşturulur](https://www.corbado.com/website-assets/65fade5ce80ed150f88b59fb_cs_2_3_COSE_algorithms_min_f0d1a5f931.png)

#### 2.3.2 transport

**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:

- **"transports": \["internal","hybrid"]**: Geçiş anahtarları, platform kimlik doğrulayıcıdan (örn. Face ID, Touch ID, Windows Hello) veya cihazlar arası kimlik doğrulama yoluyla (QR kodu ve Bluetooth kullanarak) kullanılabilir.
- **"transports": \["internal"]**: Geçiş anahtarları yalnızca platform kimlik doğrulayıcıdan (örn. Face ID, Touch ID, Windows Hello) kullanılabilir
- **Hiçbir "transports"** **özelliği ayarlanmamış:** hiçbir belirti vermeyen varsayılan davranış

### 2.4 Assertion

**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ı](https://www.passkeys-debugger.io/) (Passkeys Debugger) üzerinden kendiniz de deneyebilirsiniz.

```json
{
    "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.

#### 2.4.1 flags

İşte en ilgili **bayraklara** ve bunların kombinasyonlarına bir genel bakış:

![En önemli bayraklar userPresent, userVerified, backupEligible, backupStatus'tur](https://www.corbado.com/website-assets/65fc7ca5a6a6fb1f3e66b514_cs_2_4_flags_min_19e5ddc4ce.png)

#### 2.4.2 signature

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

![İmza, özel anahtarı doğrulamak için kullanılır](https://www.corbado.com/website-assets/65fae2ad96200e9576992209_cs_2_4_signature_min_36b9b8ccbe.png)

#### 2.4.3 userHandle

**userHandle** gerçek user_id'dir. user_id hakkında daha fazla bilgiyi [**4.1 Veritabanı Şeması**](#database-schema) bölümünde okuyabilirsiniz.

### 2.5 authenticatorSelection

**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:

#### 2.5.1 authenticatorAttachment

- **Platform:** Kimlik doğrulayıcı, istemcinin platformuna bağlıdır ve bu nedenle çıkarılamaz.
- **Cross-platform:** Kimlik doğrulayıcı istemcinin platformuna bağlı değildir ve birden fazla cihazda kullanılabilir.

#### 2.5.2 residentKey

- **Required:** Kimlik doğrulayıcı bir resident key oluşturmalıdır (mümkün değilse işlem başarısız olmalıdır).
- **Preferred:** Kimlik doğrulayıcı bir resident key oluşturmaya çalışmalıdır (mümkün değilse bir non-resident key oluşturmalıdır).
- **Discouraged:** Kimlik doğrulayıcı bir non-resident key oluşturmalıdır (mümkün değilse işlem başarısız olmalıdı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-&gt; 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](https://www.w3.org/TR/webauthn-3/#sctn-credential-id); 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.

#### 2.5.3 userVerification

- **Required:** İşlem kullanıcıyı doğrulamalıdır.
- **Preferred:** İşlem kullanıcıyı doğrulamalıdır, ancak onsuz da devam edebilir (standart seçenek)
- **Discouraged:** İşlem kullanıcıyı doğrulamamalıdır.

> **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](https://web.dev/articles/passkey-form-autofill) okuyun).

## 3. Conditional UI (Koşullu Kullanıcı Arayüzü)

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

### 3.1 Conditional UI ile Giriş Akışı

![WebAuthn'de Conditional UI ile bir girişin süreç akışı](https://www.corbado.com/website-assets/65fae71a75d50f6ba14041d9_cs_3_1_conditional_ui_flow_min_394a12f521.png)_Normal bir giriş gibi, Conditional UI da PublicKeyCredentialRequestOptions ve assertion nesnelerini kullanır_

### 3.2 Cihaz Uyumluluğu

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):

![İşletim sistemi/tarayıcı kombinasyonlarında Conditional UI kullanılabilirliğini gösteren tablo](https://www.corbado.com/website-assets/65fae8d6321e72be11445913_cs_3_2_conditional_ui_compatibility_min_d5767f13b3.png)

Güncel bir genel bakış için [bu web sitesine](https://caniuse.com/mdn-api_publickeycredential_isconditionalmediationavailable_static) bakın.

### 3.3 Kod Örnekleri

#### 3.3.1 Conditional UI Yöntemi

Bir Conditional UI yöntemi için tam, minimalist bir kod şu şekildedir:

```html
<!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>
```

#### 3.3.2 Tarayıcı Uyumluluk Kontrolü

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:

- Tarayıcının Conditional UI'yi desteklemesi gerekir ([3.2 Cihaz Uyumluluğu](#device-compatibility) bölümüne bakın).
- JavaScript etkinleştirilmelidir ve web sayfası bir HTML giriş alanı sağlamalıdır.
- Zaman aşımı parametreleri dikkate alınmamalıdır

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.

```javascript
// 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",
        });
        /*
    ...
    */
    }
}
```

#### 3.3.3 Giriş Alanlarında Otomatik Doldurma Token'ı (Autocomplete Token)

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:

- autocomplete="username webauthn": Geçiş anahtarlarını görüntülemenin yanı sıra, bu aynı zamanda kullanıcı adı otomatik doldurmayı da önerir.
- autocomplete="current-password webauthn": Geçiş anahtarlarını görüntülemenin yanı sıra, bu ayrıca şifre otomatik doldurma için istemde bulunur.

```html
<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" />
```

## 4. WebAuthn Sunucusu

### 4.1 Veritabanı Şeması

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:

![Bir WebAuthn sunucusu için 'user' ve 'credential' verilerini içeren örnek veritabanı şeması](https://www.corbado.com/website-assets/65fc7cda64ff7798cdbb2dfc_cs_4_1_database_schema_min_8ac4536120.png)_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._

#### 4.1.1 Kimlik doğrulama ile ilgili veriler

- **Kimlik Bilgisi Kimliği (Credential ID):** Bu, bir geçiş anahtarının kaydı sırasında kimlik doğrulayıcı tarafından oluşturulan benzersiz bir kimliktir. Geçiş anahtarıyla ilişkili gerçek kullanıcı hesabını aramak için kullanılmalıdır. Ek olarak, kimlik doğrulaması için kullanılan hesabı doğrulamak üzere userHandle (user_id'den gelen) karşılaştırılmalıdır. Zaman içinde değişebileceğinden, karşılaştırma için user.name niteliğini kullanmayın.
- **Kullanıcı Kimliği (User ID / user_id):** Sistemlerinde bir kullanıcı hesabını temsil etmek için Relying Party tarafından belirtilen benzersiz kimlik. assertion nesnesi içinde userHandle olarak döndürülür.

#### 4.1.2 Geçiş anahtarlarının görüntülenmesi ve seçimi için meta veriler:

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

### 4.2 Relying Party ID (rpId)

**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:

1. URL, tam olarak rpId ile eşleşiyorsa VEYA
2. URL, rpId ile eşleşen bir alt alan adıdır ve üst alan Public Suffix List'te değilse

İşte izin verilen ve verilmeyen kombinasyonlar için örnekler:

![İzin verilen ve verilmeyen Relying Party ID kombinasyonları için örnekler](https://www.corbado.com/website-assets/65fc7d099bf36909d7f40495_cs_4_2_rpid_examples_min_55f5750e90.png)

## 5. Faydalı Web Siteleri ve Araçlar

Geçiş anahtarlarını uygulamak için kullanışlı araçların ve web sitelerinin bir listesi aşağıdadır.

- [**Geçiş Anahtarı Hata Ayıklayıcı:**](https://www.passkeys-debugger.io/) (Passkeys Debugger) WebAuthn Yanıtlarını JSON olarak ayıklamak ve farklı seçeneklerle WebAuthn işlemlerini test etmek için araç.
- [**Geçiş Anahtarı Sözlüğü:**](https://www.corbado.com/glossary) Geçiş anahtarıyla ilgili terimlerin ve kavramların açıklaması
- [**WebAuthn Spesifikasyonu:**](https://www.w3.org/TR/webauthn-2/) Bu resmi WebAuthn spesifikasyonudur.
- [**Chrome Cihaz Günlüğü:**](http://chrome://device-log) Cihazınızın WebAuthn işlemlerinin günlüğünü göstermek için araç (yalnızca `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](https://docs.corbado.com/start) (yeni uygulamalar için) veya [Corbado Connect](https://www.corbado.com/enterprise) (mevcut uygulamalar için) de kullanabilirsiniz.

## Sıkça Sorulan Sorular

### Web uygulamamda geçiş anahtarı otomatik doldurma (autofill) için Conditional UI'yi nasıl uygularım?

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.

### WebAuthn kimlik doğrulamasını desteklemek için veritabanımda saklamam gereken minimum veri nedir?

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.

### WebAuthn'de resident key'ler (yerleşik anahtarlar) ile non-resident key'ler (yerleşik olmayan anahtarlar) arasındaki fark nedir?

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 nasıl çalışır ve bunu preferred (tercih edilen) olarak ayarlamanın riskleri nelerdir?

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.
