Zum Hauptinhalt springen
verifySolution() wird serverseitig in deinem Verify-Endpunkt aufgerufen, um zu prüfen, ob der Browser alle Challenge-Tokens korrekt gelöst hat. Es prüft die JWT-Signatur, den Token-Ablauf, den SHA-256-Hash-Beweis und verhindert (standardmäßig) die Wiederverwendung von Tokens.

Import

import { verifySolution } from 'ribaunt';

Signatur

function verifySolution(
  token: ChallengeToken | ChallengeToken[],
  nonce: number | string | Array<number | string> | ChallengeSolution | ChallengeSolution[],
  options?: VerifySolutionOptions
): Promise<boolean>

Parameter

token
ChallengeToken | ChallengeToken[]
erforderlich
Das/die ursprüngliche(n) JWT-Token, das/die von createChallenge() zurückgegeben wurde(n). Übergib dieselben Tokens, die dein Challenge-Endpunkt ausgegeben hat.
nonce
number | string | Array<number | string> | ChallengeSolution | ChallengeSolution[]
erforderlich
Die vom Browser eingereichte(n) Lösung(en). Kann sein:
  • Eine einzelne Nonce-Zeichenkette
  • Ein Array von Nonce-Zeichenketten
  • Ein ChallengeSolution-Objekt { nonce: string; hash: string }
  • Ein Array von ChallengeSolution-Objekten (was das Widget als solutions sendet)
options
VerifySolutionOptions
Optionales Konfigurationsobjekt. Siehe die Optionstabelle unten.

Optionen

OptionTypStandardBeschreibung
replayPrevention`‘local''remote''disabled’`'local'Steuert, wie die Wiederverwendung von Tokens verhindert wird
replayStoreReplayStoreundefinedErforderlich, wenn replayPrevention auf 'remote' gesetzt ist. Implementiert die Methode consume().
debugbooleanauto (in dev true)Verifizierungs-Warnungen in der Konsole protokollieren
onWarning(warning: VerifyWarning) => voidundefinedCallback für strukturierte Warn-Ereignisse

Rückgabewert

Promise<boolean>. Gibt true nur dann zurück, wenn ALLE Tokens gültige Lösungen haben und die Replay-Prüfungen bestehen. Gibt bei jedem Fehler false zurück, ohne einen Fehler zu werfen.

Beispiele

Grundlegende Verwendung:
const { tokens, solutions } = req.body;
const valid = await verifySolution(tokens, solutions);
Mit strukturierter Warn-Telemetrie:
const valid = await verifySolution(tokens, solutions, {
  onWarning: (warning) => {
    // warning.reason: 'invalid-token' | 'expired-token' | 'invalid-solution' | 'replay-detected' | 'configuration-error'
    console.log('captcha warning', warning.reason, warning.message);
  },
});
Mit Remote-Replay-Store:
const valid = await verifySolution(tokens, solutions, {
  replayPrevention: 'remote',
  replayStore: {
    consume: async (jti, expiresAt) => {
      // Atomic set-if-not-exists with TTL (e.g. Redis SET NX EX)
      return await redis.set(jti, '1', 'NX', 'EXAT', expiresAt) !== null;
    },
  },
});

Warn-Gründe

GrundBeschreibung
invalid-tokenJWT-Signatur ist ungültig oder fehlerhaft
expired-tokenDie Challenge-TTL ist abgelaufen
invalid-solutionDer Nonce erzeugt keinen gültigen Hash
replay-detectedToken wurde bereits verbraucht
configuration-errorreplayPrevention ist 'remote', aber kein replayStore wurde bereitgestellt