Latihan 1: Passwordless & Passkeys — Auth

Latihan 1 dari materi Passwordless & Passkeys di Auth — praktek dengan editor kode interaktif, test case otomatis, dan hint terpandu. Langsung jalan di browser.

Lengkapi tiga function di kode awal. Latihan ini meniru bagian server WebAuthn dengan object sederhana.

  1. createChallenge(userId, operation): operation adalah "register" atau "authenticate". Kembalikan object berisi:
    • challenge: 32 byte acak dari crypto.getRandomValues(new Uint8Array(32)), ditulis sebagai hex (64 karakter 0-9a-f). Challenge yang dirakit dari id user bisa ditebak.
    • userId: sama dengan argumennya
    • expiresIn: 60
    • type: "webauthn.create" kalau "register", "webauthn.get" kalau "authenticate"
  2. isValidPublicKey(publicKey): kembalikan true kalau publicKey bertipe string, panjangnya minimal 10, dan diawali "pk_". Selain itu false.
  3. matchCredential(credentialId, allowedCredentials): allowedCredentials adalah array { id, type }. Kembalikan credential yang id === credentialId dan type === "public-key", atau null kalau gak ada.

Baris-baris console.log di kode awal sudah ada, biarkan begitu. Output-nya harus persis sepuluh baris ini, berurutan:

  1. webauthn.create
  2. 60
  3. true (challenge-nya 64 karakter hex)
  4. webauthn.get
  5. true (pk_abc123xyz)
  6. false (not_a_key)
  7. false (pk_short, cuma 8 karakter)
  8. public-key (credential cred1)
  9. null (cred2 type-nya legacy)
  10. null (cred3 gak ada)

Dicek juga: createChallenge("sri", "authenticate") memberi challenge 64 karakter hex, webauthn.get, 60, dan userId sri; dua challenge untuk budi berbeda dan gak memuat budi; dan [isValidPublicKey("pk_abcdefghij"), isValidPublicKey("nope"), matchCredential("c2", [{ id: "c2", type: "public-key" }]) !== null] memberi true,false,true.

Hint