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.
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"
isValidPublicKey(publicKey): kembalikan true kalau publicKey bertipe string, panjangnya minimal 10, dan diawali "pk_". Selain itu false.
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:
webauthn.create
60
true (challenge-nya 64 karakter hex)
webauthn.get
true (pk_abc123xyz)
false (not_a_key)
false (pk_short, cuma 8 karakter)
public-key (credential cred1)
null (cred2 type-nya legacy)
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.