feat(core): Allow enforcement of MFA usage on instance (#16556)

Co-authored-by: Marc Littlemore <marc@n8n.io>
Co-authored-by: Csaba Tuncsik <csaba.tuncsik@gmail.com>
This commit is contained in:
Andreas Fitzek
2025-07-02 11:03:10 +02:00
committed by GitHub
parent 060acd2db8
commit 657e5a3b3a
56 changed files with 619 additions and 88 deletions

View File

@@ -33,3 +33,9 @@ export type DisableMfaParams = {
export async function disableMfa(context: IRestApiContext, data: DisableMfaParams): Promise<void> {
return await makeRestApiRequest(context, 'POST', '/mfa/disable', data);
}
export async function updateEnforceMfa(context: IRestApiContext, enforce: boolean): Promise<void> {
return await makeRestApiRequest(context, 'POST', '/mfa/enforce-mfa', {
enforce,
});
}

View File

@@ -19,6 +19,13 @@ const getBrowserId = () => {
export const NO_NETWORK_ERROR_CODE = 999;
export const STREAM_SEPERATOR = '⧉⇋⇋➽⌑⧉§§\n';
export class MfaRequiredError extends ApplicationError {
constructor() {
super('MFA is required to access this resource. Please set up MFA in your user settings.');
this.name = 'MfaRequiredError';
}
}
export class ResponseError extends ApplicationError {
// The HTTP status code of response
httpStatusCode?: number;
@@ -114,6 +121,9 @@ export async function request(config: {
}
const errorResponseData = error.response?.data;
if (errorResponseData?.mfaRequired === true) {
throw new MfaRequiredError();
}
if (errorResponseData?.message !== undefined) {
if (errorResponseData.name === 'NodeApiError') {
errorResponseData.httpStatusCode = error.response.status;