diff --git a/packages/server/lib/controllers/oauth.controller.ts b/packages/server/lib/controllers/oauth.controller.ts index 164d59b33fc..b48f300c362 100644 --- a/packages/server/lib/controllers/oauth.controller.ts +++ b/packages/server/lib/controllers/oauth.controller.ts @@ -633,6 +633,20 @@ class OAuthController { }); } + if (provider.authorization_url_skip_empty) { + const url = new URL(authorizationUri); + const queryParams = new URLSearchParams(url.search); + // Remove any keys with undefined or empty string values + for (const [key, value] of queryParams.entries()) { + if (value === '') { + queryParams.delete(key); + } + } + + url.search = queryParams.toString(); + authorizationUri = url.toString(); + } + void logCtx.info('Redirecting', { authorizationUri, providerConfigKey, diff --git a/packages/types/lib/providers/provider.ts b/packages/types/lib/providers/provider.ts index 0c14f23d173..833b4e6d697 100644 --- a/packages/types/lib/providers/provider.ts +++ b/packages/types/lib/providers/provider.ts @@ -62,6 +62,7 @@ export interface BaseProvider { }; authorization_url?: string; authorization_url_skip_encode?: string[]; + authorization_url_skip_empty?: boolean; access_token_url?: string; authorization_params?: Record; authorization_code_param_in_callback?: string; diff --git a/scripts/validation/providers/schema.json b/scripts/validation/providers/schema.json index 49658acc071..6ac33f93a2a 100644 --- a/scripts/validation/providers/schema.json +++ b/scripts/validation/providers/schema.json @@ -97,6 +97,9 @@ "type": "string" } }, + "authorization_url_skip_empty": { + "type": "boolean" + }, "authorization_url_replacements": { "type": "object", "additionalProperties": true