Section 12/171 menit

12. Kebutuhan Server-side

12. Kebutuhan Server-side

Passkeys membutuhkan implementasi server-side WebAuthn. Berikut endpoint dan logika yang diperlukan:

Endpoint yang Dibutuhkan

swift
POST /auth/passkey/register/begin
  Request: { username }
  Response: {
    challenge: string (base64url),
    userID: string,
    displayName: string,
    rpID: string,
    rpName: string
  }

POST /auth/passkey/register/finish
  Request: {
    credentialID: string (base64url),
    clientDataJSON: string (base64url),
    attestationObject: string (base64url)
  }
  Response: { success: bool }

POST /auth/passkey/auth/begin
  Request: {} atau { username } untuk hint
  Response: {
    challenge: string (base64url),
    allowedCredentials: [{ id: string, type: "public-key" }]
  }

POST /auth/passkey/auth/finish
  Request: {
    credentialID: string (base64url),
    clientDataJSON: string (base64url),
    authenticatorData: string (base64url),
    signature: string (base64url),
    userID: string? (base64url)
  }
  Response: { token: string, user: { id, name } }

Library Server-side yang Direkomendasikan

Bahasa Library
Node.js @simplewebauthn/server
Python py_webauthn
Go go-webauthn/webauthn
Ruby webauthn-ruby
Swift (Vapor) vapor-community/webauthn-swift
Java webauthn4j

Validasi yang Harus Dilakukan Server

swift
Saat Registrasi (finish):
1. Decode clientDataJSON → verifikasi type = "webauthn.create"
2. Verifikasi challenge cocok dengan yang dikirim (dan belum expired)
3. Verifikasi origin = https://yourdomain.com
4. Verifikasi rpIdHash dalam attestationObject
5. Parse credentialPublicKey dari attestedCredentialData
6. Simpan credentialID + publicKey + userID ke database

Saat Autentikasi (finish):
1. Cari publicKey berdasarkan credentialID
2. Decode clientDataJSON → verifikasi type = "webauthn.get"
3. Verifikasi challenge cocok
4. Verifikasi origin dan rpIdHash
5. Verifikasi UP flag (user present) di authenticatorData
6. Verifikasi signature menggunakan publicKey yang tersimpan
7. Update signCount (opsional, untuk cloning detection)
8. Issue session token