Skip to main content

ChallengeResponseData

Package: @nauth-toolkit/core Type: TypeScript Type (Union)

Discriminated union type for responding to authentication challenges. Different fields are required based on the challenge type.

import { ChallengeResponseData } from '@nauth-toolkit/nestjs';

Overview​

ChallengeResponseData is a TypeScript discriminated union that provides type-safe challenge responses. It is used with AuthService.respondToChallenge() to handle various authentication challenges including email verification, phone verification, MFA, and password changes.

Challenge Types​

VerifyEmailResponse​

Used to respond to email verification challenges.

PropertyTypeDescription
sessionstringChallenge session token
type'VERIFY_EMAIL'Challenge type discriminator
codestring6-digit verification code from email

CollectPhoneResponse​

Used to submit phone number for verification.

PropertyTypeDescription
sessionstringChallenge session token
type'VERIFY_PHONE'Challenge type discriminator
phonestringPhone number in E.164 format

VerifyPhoneResponse​

Used to verify phone with SMS code.

PropertyTypeDescription
sessionstringChallenge session token
type'VERIFY_PHONE'Challenge type discriminator
codestring6-digit verification code from SMS

VerifyMFACodeResponse​

Used for MFA verification with code (SMS/TOTP/Backup).

PropertyTypeDescription
sessionstringChallenge session token
type'MFA_REQUIRED'Challenge type discriminator
method'sms' | 'totp' | 'backup'MFA method type
codestringVerification code
deviceIdnumber (optional)Device ID for TOTP methods that support multiple devices

VerifyMFAPasskeyResponse​

Used for MFA verification with passkey (WebAuthn).

PropertyTypeDescription
sessionstringChallenge session token
type'MFA_REQUIRED'Challenge type discriminator
method'passkey'Passkey method
credentialRecord<string, unknown>WebAuthn credential from browser API
deviceIdnumber (optional)Device ID for passkey methods that support multiple devices

ForceChangePasswordResponse​

Used when user must change their password.

PropertyTypeDescription
sessionstringChallenge session token
type'FORCE_CHANGE_PASSWORD'Challenge type discriminator
newPasswordstringNew password meeting requirements

MFASetupResponse​

Used during MFA setup in challenge flow.

PropertyTypeDescription
sessionstringChallenge session token
type'MFA_SETUP_REQUIRED'Challenge type discriminator
method'sms' | 'email' | 'totp' | 'passkey'MFA method being set up
setupDataRecord<string, unknown>Method-specific setup data

Setup Data Structure:

  • SMS: { phone: string, code: string }
  • TOTP: { code: string }
  • Passkey: { credential: Record<string, unknown> }

Usage Examples​

import { AuthService, ChallengeResponseData } from '@nauth-toolkit/nestjs';

// Email verification
const emailResponse: ChallengeResponseData = {
session: 'challenge-session-token',
type: 'VERIFY_EMAIL',
code: '123456',
};
const result = await authService.respondToChallenge(emailResponse);

// Phone verification (two-step)
const phoneCollect: ChallengeResponseData = {
session: 'session-token',
type: 'VERIFY_PHONE',
phone: '+14155552671',
};
await authService.respondToChallenge(phoneCollect);

const phoneVerify: ChallengeResponseData = {
session: 'session-token',
type: 'VERIFY_PHONE',
code: '654321',
};
await authService.respondToChallenge(phoneVerify);

// MFA with TOTP
const mfaResponse: ChallengeResponseData = {
session: 'session-token',
type: 'MFA_REQUIRED',
method: 'totp',
code: '123456',
};
await authService.respondToChallenge(mfaResponse);

// Force password change
const passwordResponse: ChallengeResponseData = {
session: 'session-token',
type: 'FORCE_CHANGE_PASSWORD',
newPassword: 'NewSecurePassword123!',
};
await authService.respondToChallenge(passwordResponse);

Type-Safe Handling​

TypeScript narrows the type based on discriminators:

function handleChallengeResponse(response: ChallengeResponseData) {
switch (response.type) {
case 'VERIFY_EMAIL':
// TypeScript knows response.code is available
console.log(response.code);
break;

case 'MFA_REQUIRED':
if (response.method === 'passkey') {
// TypeScript knows response.credential is available
console.log(response.credential);
} else {
// TypeScript knows response.code is available
console.log(response.code);
}
break;

case 'FORCE_CHANGE_PASSWORD':
// TypeScript knows response.newPassword is available
console.log(response.newPassword);
break;
}
}