UNPKG

@linkedmink/passport-mutual-key-challenge

Version:

Implements a Passport strategy to authenticate the public key of a user by issuing a dynamic generated challenge

56 lines (45 loc) 1.47 kB
import { CachedChallenge, ChallengeCache } from "./Types/ChallengeCache"; /** * A memory cache that can be used to store pending challenges. This will not work * in a distributed system. */ export class LocalChallengeCache implements ChallengeCache { private readonly challengeMap = new Map<string, CachedChallenge>(); private readonly clearTimeouts = new Map<string, NodeJS.Timeout>(); /** * @param ttlMs The number of milliseconds to keep the challenge in cache * @default 120000 */ constructor(private readonly ttlMs = 120000) {} /** * @param key The key to retrieve * @return The cached challenge or null if the key is expired or does not exist */ get(key: string): CachedChallenge | null { const challenge = this.challengeMap.get(key); if (!challenge) { return null; } this.challengeMap.delete(key); this.clearTimeouts.delete(key); if (Date.now() - challenge.requestDateTime.getTime() > this.ttlMs) { return null; } return challenge; } /** * @param key The key to save * @param value The value to save */ set(key: string, value: CachedChallenge): void { if (this.clearTimeouts.has(key)) { this.clearTimeouts.delete(key); } this.challengeMap.set(key, value); const timeout = setTimeout(() => { this.challengeMap.delete(key); this.clearTimeouts.delete(key); }, this.ttlMs); this.clearTimeouts.set(key, timeout); } }