mirror of
https://github.com/Sagit-chu/flvx.git
synced 2026-10-06 10:06:36 +08:00
feat: support username-free passkey login
This commit is contained in:
@@ -9,21 +9,48 @@ import (
|
||||
|
||||
func TestPasskeyChallengeExpiresAndIsSingleUse(t *testing.T) {
|
||||
h := &Handler{passkeyPending: make(map[string]passkeyCeremony)}
|
||||
id, ok := h.putPasskeyCeremony(passkeyCeremony{userID: 7, kind: "login", origin: "https://panel.example.test", session: webauthn.SessionData{Expires: time.Now().Add(time.Minute)}})
|
||||
id, ok := h.putPasskeyCeremony(passkeyCeremony{userID: 7, kind: "register", origin: "https://panel.example.test", session: webauthn.SessionData{Expires: time.Now().Add(time.Minute)}})
|
||||
if !ok {
|
||||
t.Fatal("could not create challenge")
|
||||
}
|
||||
if _, ok := h.takePasskeyCeremony(id, "login", "https://panel.example.test", 7); !ok {
|
||||
if _, ok := h.takePasskeyCeremony(id, "register", "https://panel.example.test", 7); !ok {
|
||||
t.Fatal("valid challenge was rejected")
|
||||
}
|
||||
if _, ok := h.takePasskeyCeremony(id, "login", "https://panel.example.test", 7); ok {
|
||||
if _, ok := h.takePasskeyCeremony(id, "register", "https://panel.example.test", 7); ok {
|
||||
t.Fatal("challenge was reusable")
|
||||
}
|
||||
id, ok = h.putPasskeyCeremony(passkeyCeremony{userID: 7, kind: "login", origin: "https://panel.example.test", session: webauthn.SessionData{Expires: time.Now().Add(-time.Second)}})
|
||||
id, ok = h.putPasskeyCeremony(passkeyCeremony{userID: 7, kind: "register", origin: "https://panel.example.test", session: webauthn.SessionData{Expires: time.Now().Add(-time.Second)}})
|
||||
if !ok {
|
||||
t.Fatal("could not create expired challenge")
|
||||
}
|
||||
if _, ok := h.takePasskeyCeremony(id, "login", "https://panel.example.test", 7); ok {
|
||||
if _, ok := h.takePasskeyCeremony(id, "register", "https://panel.example.test", 7); ok {
|
||||
t.Fatal("expired challenge was accepted")
|
||||
}
|
||||
id, ok = h.putPasskeyCeremony(passkeyCeremony{kind: "login-discoverable", origin: "https://panel.example.test", session: webauthn.SessionData{Expires: time.Now().Add(time.Minute)}})
|
||||
if !ok {
|
||||
t.Fatal("could not create discoverable challenge")
|
||||
}
|
||||
if _, ok := h.takePasskeyLoginCeremony(id, "https://wrong.example.test"); ok {
|
||||
t.Fatal("wrong origin was accepted")
|
||||
}
|
||||
if _, ok := h.takePasskeyLoginCeremony(id, "https://panel.example.test"); ok {
|
||||
t.Fatal("failed discoverable challenge was reusable")
|
||||
}
|
||||
id, ok = h.putPasskeyCeremony(passkeyCeremony{kind: "login-discoverable", origin: "https://panel.example.test", session: webauthn.SessionData{Expires: time.Now().Add(time.Minute)}})
|
||||
if !ok {
|
||||
t.Fatal("could not create discoverable challenge")
|
||||
}
|
||||
if _, ok := h.takePasskeyLoginCeremony(id, "https://panel.example.test"); !ok {
|
||||
t.Fatal("valid discoverable challenge was rejected")
|
||||
}
|
||||
if _, ok := h.takePasskeyLoginCeremony(id, "https://panel.example.test"); ok {
|
||||
t.Fatal("discoverable challenge was reusable")
|
||||
}
|
||||
id, ok = h.putPasskeyCeremony(passkeyCeremony{kind: "login-discoverable", origin: "https://panel.example.test", session: webauthn.SessionData{Expires: time.Now().Add(-time.Second)}})
|
||||
if !ok {
|
||||
t.Fatal("could not create expired discoverable challenge")
|
||||
}
|
||||
if _, ok := h.takePasskeyLoginCeremony(id, "https://panel.example.test"); ok {
|
||||
t.Fatal("expired discoverable challenge was accepted")
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user