@linkedmink/passport-mutual-key-challenge
Version:
Implements a Passport strategy to authenticate the public key of a user by issuing a dynamic generated challenge
48 lines (43 loc) • 1.7 kB
text/typescript
import { KeyLike } from "crypto";
import { IncomingMessage } from "http";
import { ChallengeError } from ".";
import { ClientChallenge, ClientResponse } from "./Messages";
/**
* A user with their stored, preverified public key
*/
export interface UserKeyRecord<TUser = unknown> {
/**
* The user that will be the second parameter of the passport.authenticate callback
* when authentication succeeds
*/
user: TUser;
/**
* If a string or buffer, the key type will be assumed from crypto.createPublicKey
*/
publicKey: KeyLike;
}
/**
* A function to retrieve the server's private key.
* @return The servers private key
*/
export type GetServerKeyFunc = () => KeyLike | Promise<KeyLike>;
/**
* @param req: The HTTP request from the client
* @param userId: A key that can find the user passed from the IncomingMessage
* @return The user and their public key if they exist or null if they don't
*/
export type GetUserFunc<T = unknown> = (
req: IncomingMessage,
userId: string
) => UserKeyRecord<T> | null | Promise<UserKeyRecord<T> | null>;
/**
* A function that extracts the public/private key challenge/response from the HTTP request
* @param req: The HTTP request from the client
* @return If ClientChallenge, the strategy will return a challenge to the client with the
* decrypted client challenge. If ClientResponse, the strategy will verify the client's response
* and call success for the passport.authenticate callback to consume the user. If ChallengeError,
* the parameters could not be extracted, so do not proceed.
*/
export type GetClientChallengeOrResponseFunc = (
req: IncomingMessage
) => ClientChallenge | ClientResponse | ChallengeError;