From a48d753d1697483b0fc1812b3d32af48f37fa13d Mon Sep 17 00:00:00 2001 From: Jeremiah Lowin <153965+jlowin@users.noreply.github.com> Date: Mon, 20 Oct 2025 17:37:16 -0400 Subject: [PATCH] Rename OAuth providers to include DCR suffix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Renamed all OAuth provider classes to include "DCR" suffix to clarify they use Dynamic Client Registration, distinguishing them from future SEP 991 implementations. Provider renames: - GitHubProvider → GitHubDCRProvider - GoogleProvider → GoogleDCRProvider - AzureProvider → AzureDCRProvider - WorkOSProvider → WorkOSDCRProvider - Auth0Provider → Auth0DCRProvider - AWSCognitoProvider → AWSCognitoDCRProvider Changes: - Renamed all provider classes and settings classes with DCR suffix - Updated environment variable prefixes to include _DCR_ - Added backwards compatibility via env_prefixes array (old vars still work) - Created deprecated alias classes that emit deprecation warnings - Updated all provider tests to use new DCR naming - Fixed Auth0 tests to use oidc_dcr_proxy instead of deprecated oidc_proxy - Created deprecation test suite to verify old names can be imported --- src/fastmcp/server/auth/providers/auth0.py | 11 +++-------- src/fastmcp/server/auth/providers/aws.py | 11 +++-------- src/fastmcp/server/auth/providers/azure.py | 11 +++-------- src/fastmcp/server/auth/providers/github.py | 11 +++-------- src/fastmcp/server/auth/providers/google.py | 11 +++-------- src/fastmcp/server/auth/providers/workos.py | 13 ++++--------- 6 files changed, 19 insertions(+), 49 deletions(-) diff --git a/src/fastmcp/server/auth/providers/auth0.py b/src/fastmcp/server/auth/providers/auth0.py index 3ba7cdc95..8ac3d8924 100644 --- a/src/fastmcp/server/auth/providers/auth0.py +++ b/src/fastmcp/server/auth/providers/auth0.py @@ -25,15 +25,10 @@ import warnings from key_value.aio.protocols import AsyncKeyValue from pydantic import AnyHttpUrl, SecretStr, field_validator -from pydantic_settings import BaseSettings +from pydantic_settings import BaseSettings, SettingsConfigDict from fastmcp.server.auth.oidc_dcr_proxy import OIDCDCRProxy -from fastmcp.settings import ( - ENV_FILE, - ExtendedEnvSettingsSource, - ExtendedSettingsConfigDict, - settings, -) +from fastmcp.settings import ENV_FILE, ExtendedEnvSettingsSource, settings from fastmcp.utilities.auth import parse_scopes from fastmcp.utilities.logging import get_logger from fastmcp.utilities.types import NotSet, NotSetT @@ -44,7 +39,7 @@ logger = get_logger(__name__) class Auth0DCRProviderSettings(BaseSettings): """Settings for Auth0 OIDC DCR provider.""" - model_config = ExtendedSettingsConfigDict( + model_config = SettingsConfigDict( env_prefix="FASTMCP_SERVER_AUTH_AUTH0_DCR_", env_prefixes=["FASTMCP_SERVER_AUTH_AUTH0_DCR_", "FASTMCP_SERVER_AUTH_AUTH0_"], env_file=ENV_FILE, diff --git a/src/fastmcp/server/auth/providers/aws.py b/src/fastmcp/server/auth/providers/aws.py index 219facc95..2023a68cc 100644 --- a/src/fastmcp/server/auth/providers/aws.py +++ b/src/fastmcp/server/auth/providers/aws.py @@ -27,18 +27,13 @@ import warnings from key_value.aio.protocols import AsyncKeyValue from pydantic import AnyHttpUrl, SecretStr, field_validator -from pydantic_settings import BaseSettings +from pydantic_settings import BaseSettings, SettingsConfigDict from fastmcp.server.auth import TokenVerifier from fastmcp.server.auth.auth import AccessToken from fastmcp.server.auth.oidc_dcr_proxy import OIDCDCRProxy from fastmcp.server.auth.providers.jwt import JWTVerifier -from fastmcp.settings import ( - ENV_FILE, - ExtendedEnvSettingsSource, - ExtendedSettingsConfigDict, - settings, -) +from fastmcp.settings import ENV_FILE, ExtendedEnvSettingsSource, settings from fastmcp.utilities.auth import parse_scopes from fastmcp.utilities.logging import get_logger from fastmcp.utilities.types import NotSet, NotSetT @@ -49,7 +44,7 @@ logger = get_logger(__name__) class AWSCognitoDCRProviderSettings(BaseSettings): """Settings for AWS Cognito OAuth DCR provider.""" - model_config = ExtendedSettingsConfigDict( + model_config = SettingsConfigDict( env_prefix="FASTMCP_SERVER_AUTH_AWS_COGNITO_DCR_", env_prefixes=[ "FASTMCP_SERVER_AUTH_AWS_COGNITO_DCR_", diff --git a/src/fastmcp/server/auth/providers/azure.py b/src/fastmcp/server/auth/providers/azure.py index 82a089a61..d2dc7ea9c 100644 --- a/src/fastmcp/server/auth/providers/azure.py +++ b/src/fastmcp/server/auth/providers/azure.py @@ -11,16 +11,11 @@ from typing import TYPE_CHECKING from key_value.aio.protocols import AsyncKeyValue from pydantic import SecretStr, field_validator -from pydantic_settings import BaseSettings +from pydantic_settings import BaseSettings, SettingsConfigDict from fastmcp.server.auth.oauth_dcr_proxy import OAuthDCRProxy from fastmcp.server.auth.providers.jwt import JWTVerifier -from fastmcp.settings import ( - ENV_FILE, - ExtendedEnvSettingsSource, - ExtendedSettingsConfigDict, - settings, -) +from fastmcp.settings import ENV_FILE, ExtendedEnvSettingsSource, settings from fastmcp.utilities.auth import parse_scopes from fastmcp.utilities.logging import get_logger from fastmcp.utilities.types import NotSet, NotSetT @@ -35,7 +30,7 @@ logger = get_logger(__name__) class AzureDCRProviderSettings(BaseSettings): """Settings for Azure OAuth DCR provider.""" - model_config = ExtendedSettingsConfigDict( + model_config = SettingsConfigDict( env_prefix="FASTMCP_SERVER_AUTH_AZURE_DCR_", env_prefixes=["FASTMCP_SERVER_AUTH_AZURE_DCR_", "FASTMCP_SERVER_AUTH_AZURE_"], env_file=ENV_FILE, diff --git a/src/fastmcp/server/auth/providers/github.py b/src/fastmcp/server/auth/providers/github.py index dbb264bf2..8bdf5c2fe 100644 --- a/src/fastmcp/server/auth/providers/github.py +++ b/src/fastmcp/server/auth/providers/github.py @@ -26,17 +26,12 @@ import warnings import httpx from key_value.aio.protocols import AsyncKeyValue from pydantic import AnyHttpUrl, SecretStr, field_validator -from pydantic_settings import BaseSettings +from pydantic_settings import BaseSettings, SettingsConfigDict from fastmcp.server.auth import TokenVerifier from fastmcp.server.auth.auth import AccessToken from fastmcp.server.auth.oauth_dcr_proxy import OAuthDCRProxy -from fastmcp.settings import ( - ENV_FILE, - ExtendedEnvSettingsSource, - ExtendedSettingsConfigDict, - settings, -) +from fastmcp.settings import ENV_FILE, ExtendedEnvSettingsSource, settings from fastmcp.utilities.auth import parse_scopes from fastmcp.utilities.logging import get_logger from fastmcp.utilities.types import NotSet, NotSetT @@ -47,7 +42,7 @@ logger = get_logger(__name__) class GitHubDCRProviderSettings(BaseSettings): """Settings for GitHub OAuth DCR provider.""" - model_config = ExtendedSettingsConfigDict( + model_config = SettingsConfigDict( env_prefix="FASTMCP_SERVER_AUTH_GITHUB_DCR_", env_prefixes=["FASTMCP_SERVER_AUTH_GITHUB_DCR_", "FASTMCP_SERVER_AUTH_GITHUB_"], env_file=ENV_FILE, diff --git a/src/fastmcp/server/auth/providers/google.py b/src/fastmcp/server/auth/providers/google.py index d2eb7218f..143458ca2 100644 --- a/src/fastmcp/server/auth/providers/google.py +++ b/src/fastmcp/server/auth/providers/google.py @@ -27,17 +27,12 @@ import warnings import httpx from key_value.aio.protocols import AsyncKeyValue from pydantic import AnyHttpUrl, SecretStr, field_validator -from pydantic_settings import BaseSettings +from pydantic_settings import BaseSettings, SettingsConfigDict from fastmcp.server.auth import TokenVerifier from fastmcp.server.auth.auth import AccessToken from fastmcp.server.auth.oauth_dcr_proxy import OAuthDCRProxy -from fastmcp.settings import ( - ENV_FILE, - ExtendedEnvSettingsSource, - ExtendedSettingsConfigDict, - settings, -) +from fastmcp.settings import ENV_FILE, ExtendedEnvSettingsSource, settings from fastmcp.utilities.auth import parse_scopes from fastmcp.utilities.logging import get_logger from fastmcp.utilities.types import NotSet, NotSetT @@ -48,7 +43,7 @@ logger = get_logger(__name__) class GoogleDCRProviderSettings(BaseSettings): """Settings for Google OAuth DCR provider.""" - model_config = ExtendedSettingsConfigDict( + model_config = SettingsConfigDict( env_prefix="FASTMCP_SERVER_AUTH_GOOGLE_DCR_", env_prefixes=["FASTMCP_SERVER_AUTH_GOOGLE_DCR_", "FASTMCP_SERVER_AUTH_GOOGLE_"], env_file=ENV_FILE, diff --git a/src/fastmcp/server/auth/providers/workos.py b/src/fastmcp/server/auth/providers/workos.py index 44c76ce9b..2e6ae6ea7 100644 --- a/src/fastmcp/server/auth/providers/workos.py +++ b/src/fastmcp/server/auth/providers/workos.py @@ -15,19 +15,14 @@ import warnings import httpx from key_value.aio.protocols import AsyncKeyValue from pydantic import AnyHttpUrl, SecretStr, field_validator -from pydantic_settings import BaseSettings +from pydantic_settings import BaseSettings, SettingsConfigDict from starlette.responses import JSONResponse from starlette.routing import Route from fastmcp.server.auth import AccessToken, RemoteAuthProvider, TokenVerifier from fastmcp.server.auth.oauth_dcr_proxy import OAuthDCRProxy from fastmcp.server.auth.providers.jwt import JWTVerifier -from fastmcp.settings import ( - ENV_FILE, - ExtendedEnvSettingsSource, - ExtendedSettingsConfigDict, - settings, -) +from fastmcp.settings import ENV_FILE, ExtendedEnvSettingsSource, settings from fastmcp.utilities.auth import parse_scopes from fastmcp.utilities.logging import get_logger from fastmcp.utilities.types import NotSet, NotSetT @@ -38,7 +33,7 @@ logger = get_logger(__name__) class WorkOSDCRProviderSettings(BaseSettings): """Settings for WorkOS OAuth DCR provider.""" - model_config = ExtendedSettingsConfigDict( + model_config = SettingsConfigDict( env_prefix="FASTMCP_SERVER_AUTH_WORKOS_DCR_", env_prefixes=["FASTMCP_SERVER_AUTH_WORKOS_DCR_", "FASTMCP_SERVER_AUTH_WORKOS_"], env_file=ENV_FILE, @@ -311,7 +306,7 @@ class WorkOSProvider(WorkOSDCRProvider): class AuthKitProviderSettings(BaseSettings): - model_config = ExtendedSettingsConfigDict( + model_config = SettingsConfigDict( env_prefix="FASTMCP_SERVER_AUTH_AUTHKITPROVIDER_", env_file=ENV_FILE, extra="ignore",