{"record":{"id":"ebda718b17629076","repo":"medusajs/medusa","slug":"mfa-method-method-does-not-support-recovery-c","errorCode":null,"errorMessage":"MFA method \"${method}\" does not support recovery code generation","messagePattern":"MFA method \"(.+?)\" does not support recovery code generation","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/modules/auth/src/services/mfa-provider.ts","lineNumber":111,"sourceCode":"\n    if (!this.isAuthMfaProvider_(provider)) {\n      throw new Error(\n        `MFA provider \"${method}\" does not support setup verification`\n      )\n    }\n\n    return await provider.verifySetup(data, sharedContext)\n  }\n\n  async generateCodes(\n    method: string,\n    data: { auth_identity_id: string; count: number },\n    sharedContext?: Context\n  ): Promise<string[]> {\n    const provider = this.retrieveProviderRegistration(method)\n\n    if (!this.isRecoveryCodeProvider_(provider)) {\n      throw new Error(\n        `MFA method \"${method}\" does not support recovery code generation`\n      )\n    }\n\n    return await provider.generateCodes(data, sharedContext)\n  }\n\n  protected isAuthMfaProvider_(\n    provider: IAuthMfaProvider\n  ): provider is AuthMfaProvider {\n    return \"start\" in provider && \"verifySetup\" in provider\n  }\n\n  protected isRecoveryCodeProvider_(\n    provider: IAuthMfaProvider\n  ): provider is RecoveryCodeAuthMfaProvider {\n    return \"generateCodes\" in provider\n  }","sourceCodeStart":93,"sourceCodeEnd":129,"githubUrl":"https://github.com/medusajs/medusa/blob/5e06e544a296b9033f20f71f11c559f81a0e5739/packages/modules/auth/src/services/mfa-provider.ts#L93-L129","documentation":"Plain Error from generateCodes(): the resolved provider for the given method does not implement the recovery-code provider interface (isRecoveryCodeProvider_ false), so it cannot generate recovery codes.","triggerScenarios":"Calling generateCodes with a method whose provider supports MFA but not recovery-code generation (missing generateCodes implementation); wrong method key; provider plugin version predating recovery-code support.","commonSituations":"Custom MFA providers that implemented start/verify but not generateCodes; upgrading expectations without upgrading the provider package.","solutions":["Use a provider that implements recovery-code generation, or omit recovery codes for that method","Implement generateCodes on the custom provider and mark it a recovery-code provider","Check the provider package version supports recovery codes"],"exampleFix":"// before\nconst codes = await authMfaProviderService.generateCodes('custom-mfa', { auth_identity_id, count })\n// after\nconst codes = providerSupportsRecoveryCodes('custom-mfa')\n  ? await authMfaProviderService.generateCodes('custom-mfa', { auth_identity_id, count })\n  : []","handlingStrategy":"type-guard","validationCode":"null","typeGuard":"const supportsRecoveryCodes = (method: string): boolean => ['totp'].includes(method)","tryCatchPattern":"try { return await authMfaProviderService.generateCodes(method, data) } catch (e) { if (/does not support recovery code/.test(e.message)) return []; throw e }","preventionTips":["Only offer recovery-code generation for providers that implement it","Implement generateCodes on custom providers"],"tags":["mfa","provider","recovery-codes","configuration"],"backgroundTag":"provider-not-supported","analyzedSha":"5e06e544a296b9033f20f71f11c559f81a0e5739","analyzedAt":"2026-08-27T07:24:39.599Z","schemaVersion":2},"datasetVersion":"2026-08-27T08:17:20.692Z"}