spinny:~/writing $ less passkeys-webauthn-passwordless-authentication.md
12Yıllardır onlarla yaşadığımız için normalleştirdiğimiz şeylerden biri de şifreler. Kullanıcılar bunları unutuyor, yeniden kullanıyor, yazmamaları gereken yerlere yazıyor. Ekipler sıfırlamaları, politikaları, karmaları, sızıntıları, kimlik avını ve desteği yönetmelidir.34passkey kimlik doğrulamayı mükemmel yapmaz ancak büyük bir sorunu ortadan kaldırır: Sunucunun artık kullanıcıyla paylaşılan bir sırrı saklaması gerekmez.56## Gerçekten ne oluyor78passkey, WebAuthn'ye dayalı bir kimlik bilgisidir. Kullanıcı bunu oluşturduğunda cihaz bir anahtar çifti oluşturur:910- cihazda veya şifre yöneticisinde kalan özel bir anahtar;11- sunucunun kaydedebileceği ortak anahtar.1213Sunucuya giriş yaparken "bana şifreyi söyle" sormuyor. Rastgele bir meydan okuma gönderin. Cihaz bunu özel anahtarla imzalar. Sunucu imzayı ortak anahtarla doğrular.1415İşin güzel tarafı da bu: Eğer veritabanı çalınırsa içeride kırılacak şifreler olmaz. Ve eğer bir kullanıcı sahte bir alan adı alırsa, passkey bu alan adı için geçerli değildir. Bu sadece kolaylık değil, aynı zamanda kimlik avına karşı somut bir korumadır.1617## Tarayıcı köprü görevi görür1819Tarayıcıda iki ana API şunlardır:2021- `navigator.credentials.create()` passkey oluşturmak için;22- `navigator.credentials.get()` oturum açma sırasında kullanmak için.2324Ama önemli olan mantık sunucudadır. Sunucunun sorgulamayı oluşturması, geçici olarak kaydetmesi, yanıtı doğrulaması, kaynağı kontrol etmesi ve Relying Party ID, ardından oturumu oluşturması gerekir.2526Müşteri kısmı neredeyse sıkıcı olmalı:2728```typescript29const options = await fetch('/api/passkeys/login/options').then((r) => r.json());3031const credential = await navigator.credentials.get({32 publicKey: PublicKeyCredential.parseRequestOptionsFromJSON(options),33});3435await fetch('/api/passkeys/login/verify', {36 method: 'POST',37 headers: { 'Content-Type': 'application/json' },38 body: JSON.stringify(credential?.toJSON()),39});40```4142Kendinizi WebAuthn şifrelemeyi elle uygularken bulursanız durun. Sağlam bir sunucu tarafı kitaplığı kullanın. Buradaki hatalar "sevimli böcekler" değil, kimlik doğrulama delikleridir.4344## Veritabanına ne kaydedilmeli4546Dünyanın yarısını kurtarmaya gerek yok. Genellikle yeterli:4748- Kimlik bilgilerinin kimliği;49- genel anahtar;50- bağlı kullanıcı;51- herhangi bir doğrulama sayacı veya meta verisi;52- UX için yararlıysa aktarımlar;53- kullanıcı tarafından seçilen ad;54- oluşturulma tarihi ve son kullanım.5556Minimal bir tablo şöyle görünebilir:5758```sql59create table passkey_credentials (60 id uuid primary key default gen_random_uuid(),61 user_id uuid not null references users(id),62 credential_id text not null unique,63 public_key text not null,64 name text,65 created_at timestamptz not null default now(),66 last_used_at timestamptz67);68```6970Daha sonra denetim günlükleri ve bildirimler eklerdim: Birisi hesabımda yeni bir passkey oluşturursa bunu bilmek isterim.7172## UX demodan daha önemlidir7374passkey'nin demosu her zaman güzeldir: tıklarsınız, Face ID, içeri girersiniz. Gerçek ürün daha karmaşıktır.7576Birisi telefonunu değiştiriyor. Birisi kilitli bir şirket bilgisayarını kullanıyor. Bazı insanlar tarayıcının neden passkey önerdiğini anlamıyor. Birisi cihazına erişimini kaybeder.7778Bu yüzden "bugünden itibaren herkese şifre yok" diyerek başlamayacağım. Şöyle başlardım:79801. passkey dahili kullanıcılar için isteğe bağlıdır;812. Başarılı bir giriş yaptıktan sonra bir tane oluşturma önerisi;823. yeniden adlandırmak ve kaldırmak için hesap sayfası passkey;834. geri dönüşü temizleyin;845. Ana girişte kademeli olarak kullanıma sunma.8586Arayüzdeki metin basit olmalıdır. "Cihazınızın kilit ekranını kullanın", "yerleşik FIDO2 kimlik bilgileriyle kimlik doğrulaması yapmak"tan daha iyidir.8788## Kaçınacağım hatalar8990Müşteri üzerinde zorluklar yaratmayın. Mücadele sunucuda oluşturulur ve yalnızca bir kez doğrulanması gerekir.9192Yalnızca kimlik bilgilerine güvenmeyin. İmzayı, sorgulamayı, kaynağı ve Relying Party ID doğrulamanız gerekir.9394İyi bir kurtarma akışına sahip olmadan geri dönüşleri silmeyin. Parolasız, "telefonunuzu kaybederseniz sonsuza kadar dışarıda kalırsınız" şeklinde olmak zorunda değildir.9596passkey'yi yalnızca ön uç düğmesi olarak görmeyin. Bir düğmeyi gizlemek güvenlik değildir: gerçek doğrulama sunucu tarafındadır.9798## Passkey-ilk mi yoksa passkey-dostu mu?99100Yeni bir ürün için önce passkey düşünebilirsiniz. Mevcut bir uygulama için passkey-dostu tercih ediyorum: Önerilen yöntem olarak passkey'yi ekleyin, başarıyı ve sorunları ölçün, ardından şifre ağırlığını sakin bir şekilde azaltın.101102İdeal göç hissedilmez. Kullanıcı, şirketin kimlik doğrulama protokolünü değiştirdiğini değil, oturum açmanın daha kolay olduğunu keşfeder.103104## Sonuç105106passkey ilginçtir çünkü güvenliği ve kullanıcı deneyimini aynı anda geliştirirler ki bu da nadirdir. Bunlar sihirli bir değnek değil: kurtarma, uyumluluk, destek ve kullanıma sunmanın iyi tasarlanması gerekiyor.107108Ancak temel değişiklik güçlüdür. Kullanıcılardan sırları icat etmelerini ve korumalarını istemeyi bırakın. Cihazın alan adınıza bağlı bir kriptografik kanıt imzalamasına izin verirsiniz. Daha az insan hafızası, daha az kimlik avı, daha az şifre sıfırlama. Ciddiye alınmaya değer olduklarını söyleyebilirim.109110## Kaynaklar111112- [MDN: Passkeys](https://developer.mozilla.org/en-US/docs/Web/Security/Authentication/Passkeys)113- [MDN: Web Authentication API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Authentication_API)114- [W3C: Web Authentication](https://www.w3.org/TR/webauthn-3/)115- [passkeys.dev](https://passkeys.dev/)116
:Passkey ve WebAuthn: şifresiz, sihirsiz giriş yapınlines 1-116 (END) — press q to close