diff --git a/sdk/identity/azure-identity/CHANGELOG.md b/sdk/identity/azure-identity/CHANGELOG.md index 2b99f0e3a34c..7508423b82a6 100644 --- a/sdk/identity/azure-identity/CHANGELOG.md +++ b/sdk/identity/azure-identity/CHANGELOG.md @@ -9,6 +9,7 @@ ### Bugs Fixed ### Other Changes +- Upgraded minimum `azure-core` version to 1.23.1 ## 1.11.0b3 (2022-08-09) diff --git a/sdk/identity/azure-identity/azure/identity/_credentials/azure_cli.py b/sdk/identity/azure-identity/azure/identity/_credentials/azure_cli.py index 8b5eca9f591f..e81180a4c217 100644 --- a/sdk/identity/azure-identity/azure/identity/_credentials/azure_cli.py +++ b/sdk/identity/azure-identity/azure/identity/_credentials/azure_cli.py @@ -14,7 +14,7 @@ import six -from azure.core.credentials import AccessToken +from azure.core.credentials import AccessToken, TokenCredential from azure.core.exceptions import ClientAuthenticationError from .. import CredentialUnavailableError @@ -31,16 +31,14 @@ NOT_LOGGED_IN = "Please run 'az login' to set up an account" -class AzureCliCredential(object): +class AzureCliCredential(TokenCredential): """Authenticates by requesting a token from the Azure CLI. This requires previously logging in to Azure via "az login", and will use the CLI's currently logged in identity. :keyword str tenant_id: optional tenant to include in the token request. """ - def __init__(self, *, tenant_id: str = ""): - object.__init__(self) - + def __init__(self, *, tenant_id: str = ""): # pylint:disable=super-init-not-called self.tenant_id = tenant_id def __enter__(self): diff --git a/sdk/identity/azure-identity/azure/identity/_credentials/azure_powershell.py b/sdk/identity/azure-identity/azure/identity/_credentials/azure_powershell.py index 78c34b81d76e..6790ac9c6e32 100644 --- a/sdk/identity/azure-identity/azure/identity/_credentials/azure_powershell.py +++ b/sdk/identity/azure-identity/azure/identity/_credentials/azure_powershell.py @@ -11,7 +11,7 @@ import six -from azure.core.credentials import AccessToken +from azure.core.credentials import AccessToken, TokenCredential from azure.core.exceptions import ClientAuthenticationError from .azure_cli import get_safe_working_dir @@ -47,7 +47,7 @@ """ -class AzurePowerShellCredential(object): +class AzurePowerShellCredential(TokenCredential): """Authenticates by requesting a token from Azure PowerShell. This requires previously logging in to Azure via "Connect-AzAccount", and will use the currently logged in identity. diff --git a/sdk/identity/azure-identity/azure/identity/_credentials/chained.py b/sdk/identity/azure-identity/azure/identity/_credentials/chained.py index 6002b87d82f5..277d09297181 100644 --- a/sdk/identity/azure-identity/azure/identity/_credentials/chained.py +++ b/sdk/identity/azure-identity/azure/identity/_credentials/chained.py @@ -4,6 +4,7 @@ # ------------------------------------ import logging +from azure.core.credentials import TokenCredential from azure.core.exceptions import ClientAuthenticationError from .. import CredentialUnavailableError @@ -17,7 +18,7 @@ if TYPE_CHECKING: # pylint:disable=unused-import,ungrouped-imports from typing import Any, Optional - from azure.core.credentials import AccessToken, TokenCredential + from azure.core.credentials import AccessToken _LOGGER = logging.getLogger(__name__) @@ -35,7 +36,7 @@ def _get_error_message(history): ) -class ChainedTokenCredential(object): +class ChainedTokenCredential(TokenCredential): """A sequence of credentials that is itself a credential. Its :func:`get_token` method calls ``get_token`` on each credential in the sequence, in order, returning the first @@ -45,7 +46,7 @@ class ChainedTokenCredential(object): :type credentials: :class:`azure.core.credentials.TokenCredential` """ - def __init__(self, *credentials): + def __init__(self, *credentials): # pylint:disable=super-init-not-called # type: (*TokenCredential) -> None if not credentials: raise ValueError("at least one credential is required") diff --git a/sdk/identity/azure-identity/azure/identity/_credentials/environment.py b/sdk/identity/azure-identity/azure/identity/_credentials/environment.py index 626e812350c3..26e4a8c1bdbf 100644 --- a/sdk/identity/azure-identity/azure/identity/_credentials/environment.py +++ b/sdk/identity/azure-identity/azure/identity/_credentials/environment.py @@ -5,6 +5,7 @@ import logging import os +from azure.core.credentials import TokenCredential from .. import CredentialUnavailableError from .._constants import EnvironmentVariables @@ -28,7 +29,7 @@ _LOGGER = logging.getLogger(__name__) -class EnvironmentCredential(object): +class EnvironmentCredential(TokenCredential): """A credential configured by environment variables. This credential is capable of authenticating as a service principal using a client secret or a certificate, or as @@ -63,7 +64,7 @@ class EnvironmentCredential(object): when no value is given. """ - def __init__(self, **kwargs): + def __init__(self, **kwargs): # pylint:disable=super-init-not-called # type: (Mapping[str, Any]) -> None self._credential = None # type: Optional[EnvironmentCredentialTypes] diff --git a/sdk/identity/azure-identity/azure/identity/_credentials/managed_identity.py b/sdk/identity/azure-identity/azure/identity/_credentials/managed_identity.py index cfd6db568d10..60bc0cc18bd8 100644 --- a/sdk/identity/azure-identity/azure/identity/_credentials/managed_identity.py +++ b/sdk/identity/azure-identity/azure/identity/_credentials/managed_identity.py @@ -5,6 +5,8 @@ import logging import os +from azure.core.credentials import TokenCredential + from .. import CredentialUnavailableError from .._constants import EnvironmentVariables from .._internal.decorators import log_get_token @@ -17,12 +19,12 @@ if TYPE_CHECKING: # pylint:disable=unused-import from typing import Any, Optional - from azure.core.credentials import AccessToken, TokenCredential + from azure.core.credentials import AccessToken _LOGGER = logging.getLogger(__name__) -class ManagedIdentityCredential(object): +class ManagedIdentityCredential(TokenCredential): """Authenticates with an Azure managed identity in any hosting environment which supports managed identities. This credential defaults to using a system-assigned identity. To configure a user-assigned identity, use one of @@ -38,7 +40,7 @@ class ManagedIdentityCredential(object): :paramtype identity_config: Mapping[str, str] """ - def __init__(self, **kwargs): + def __init__(self, **kwargs): # pylint:disable=super-init-not-called # type: (**Any) -> None self._credential = None # type: Optional[TokenCredential] if os.environ.get(EnvironmentVariables.IDENTITY_ENDPOINT): diff --git a/sdk/identity/azure-identity/azure/identity/_credentials/shared_cache.py b/sdk/identity/azure-identity/azure/identity/_credentials/shared_cache.py index 3cef36e80507..b104c8e71b2e 100644 --- a/sdk/identity/azure-identity/azure/identity/_credentials/shared_cache.py +++ b/sdk/identity/azure-identity/azure/identity/_credentials/shared_cache.py @@ -4,6 +4,8 @@ # ------------------------------------ from typing import TYPE_CHECKING +from azure.core.credentials import TokenCredential + from .silent import SilentAuthenticationCredential from .. import CredentialUnavailableError from .._constants import DEVELOPER_SIGN_ON_CLIENT_ID @@ -14,11 +16,10 @@ if TYPE_CHECKING: # pylint:disable=unused-import,ungrouped-imports from typing import Any, Optional - from azure.core.credentials import TokenCredential from .._internal import AadClientBase -class SharedTokenCacheCredential(object): +class SharedTokenCacheCredential(TokenCredential): """Authenticates using tokens in the local cache shared between Microsoft applications. :param str username: Username (typically an email address) of the user to authenticate as. This is used when the @@ -36,7 +37,7 @@ class SharedTokenCacheCredential(object): :paramtype cache_persistence_options: ~azure.identity.TokenCachePersistenceOptions """ - def __init__(self, username=None, **kwargs): + def __init__(self, username=None, **kwargs): # pylint:disable=super-init-not-called # type: (Optional[str], **Any) -> None if "authentication_record" in kwargs: diff --git a/sdk/identity/azure-identity/azure/identity/_credentials/silent.py b/sdk/identity/azure-identity/azure/identity/_credentials/silent.py index 08e0611fa5e4..e8fa7c59bed3 100644 --- a/sdk/identity/azure-identity/azure/identity/_credentials/silent.py +++ b/sdk/identity/azure-identity/azure/identity/_credentials/silent.py @@ -9,7 +9,7 @@ from msal import PublicClientApplication -from azure.core.credentials import AccessToken +from azure.core.credentials import AccessToken, TokenCredential from azure.core.exceptions import ClientAuthenticationError from .. import CredentialUnavailableError @@ -25,10 +25,10 @@ from .. import AuthenticationRecord -class SilentAuthenticationCredential(object): +class SilentAuthenticationCredential(TokenCredential): """Internal class for authenticating from the default shared cache given an AuthenticationRecord""" - def __init__(self, authentication_record, **kwargs): + def __init__(self, authentication_record, **kwargs): # pylint:disable=super-init-not-called # type: (AuthenticationRecord, **Any) -> None self._auth_record = authentication_record diff --git a/sdk/identity/azure-identity/azure/identity/aio/_credentials/azure_cli.py b/sdk/identity/azure-identity/azure/identity/aio/_credentials/azure_cli.py index f123a1efced8..132fcafa244e 100644 --- a/sdk/identity/azure-identity/azure/identity/aio/_credentials/azure_cli.py +++ b/sdk/identity/azure-identity/azure/identity/aio/_credentials/azure_cli.py @@ -7,7 +7,9 @@ import os from typing import TYPE_CHECKING +from azure.core.credentials_async import AsyncTokenCredential from azure.core.exceptions import ClientAuthenticationError + from .._internal import AsyncContextManager from .._internal.decorators import log_get_token_async from ... import CredentialUnavailableError @@ -27,14 +29,14 @@ from azure.core.credentials import AccessToken -class AzureCliCredential(AsyncContextManager): +class AzureCliCredential(AsyncContextManager, AsyncTokenCredential): """Authenticates by requesting a token from the Azure CLI. This requires previously logging in to Azure via "az login", and will use the CLI's currently logged in identity. :keyword str tenant_id: optional tenant to include in the token request. """ - def __init__(self, *, tenant_id: str = ""): + def __init__(self, *, tenant_id: str = ""): # pylint:disable=super-init-not-called AsyncContextManager.__init__(self) self.tenant_id = tenant_id diff --git a/sdk/identity/azure-identity/azure/identity/aio/_credentials/azure_powershell.py b/sdk/identity/azure-identity/azure/identity/aio/_credentials/azure_powershell.py index 0881dd4e2b99..0efad2072004 100644 --- a/sdk/identity/azure-identity/azure/identity/aio/_credentials/azure_powershell.py +++ b/sdk/identity/azure-identity/azure/identity/aio/_credentials/azure_powershell.py @@ -6,6 +6,8 @@ import sys from typing import cast, TYPE_CHECKING +from azure.core.credentials_async import AsyncTokenCredential + from .._internal import AsyncContextManager from .._internal.decorators import log_get_token_async from ... import CredentialUnavailableError @@ -24,7 +26,7 @@ from azure.core.credentials import AccessToken -class AzurePowerShellCredential(AsyncContextManager): +class AzurePowerShellCredential(AsyncContextManager, AsyncTokenCredential): """Authenticates by requesting a token from Azure PowerShell. This requires previously logging in to Azure via "Connect-AzAccount", and will use the currently logged in identity. diff --git a/sdk/identity/azure-identity/azure/identity/aio/_credentials/chained.py b/sdk/identity/azure-identity/azure/identity/aio/_credentials/chained.py index c0a6a9ba5b89..d6bbec20d418 100644 --- a/sdk/identity/azure-identity/azure/identity/aio/_credentials/chained.py +++ b/sdk/identity/azure-identity/azure/identity/aio/_credentials/chained.py @@ -6,6 +6,7 @@ import logging from typing import TYPE_CHECKING +from azure.core.credentials_async import AsyncTokenCredential from azure.core.exceptions import ClientAuthenticationError from .._internal import AsyncContextManager from ... import CredentialUnavailableError @@ -15,12 +16,11 @@ if TYPE_CHECKING: from typing import Any, Optional from azure.core.credentials import AccessToken - from azure.core.credentials_async import AsyncTokenCredential _LOGGER = logging.getLogger(__name__) -class ChainedTokenCredential(AsyncContextManager): +class ChainedTokenCredential(AsyncContextManager, AsyncTokenCredential): """A sequence of credentials that is itself a credential. Its :func:`get_token` method calls ``get_token`` on each credential in the sequence, in order, returning the first @@ -30,7 +30,7 @@ class ChainedTokenCredential(AsyncContextManager): :type credentials: :class:`azure.core.credentials.AsyncTokenCredential` """ - def __init__(self, *credentials: "AsyncTokenCredential") -> None: + def __init__(self, *credentials: "AsyncTokenCredential") -> None: # pylint:disable=super-init-not-called if not credentials: raise ValueError("at least one credential is required") diff --git a/sdk/identity/azure-identity/azure/identity/aio/_credentials/environment.py b/sdk/identity/azure-identity/azure/identity/aio/_credentials/environment.py index 5f5abb396346..fba150b1f207 100644 --- a/sdk/identity/azure-identity/azure/identity/aio/_credentials/environment.py +++ b/sdk/identity/azure-identity/azure/identity/aio/_credentials/environment.py @@ -6,8 +6,9 @@ import os from typing import TYPE_CHECKING -from .._internal.decorators import log_get_token_async +from azure.core.credentials_async import AsyncTokenCredential +from .._internal.decorators import log_get_token_async from ... import CredentialUnavailableError from ..._constants import EnvironmentVariables from .._internal import AsyncContextManager @@ -21,7 +22,7 @@ _LOGGER = logging.getLogger(__name__) -class EnvironmentCredential(AsyncContextManager): +class EnvironmentCredential(AsyncContextManager, AsyncTokenCredential): """A credential configured by environment variables. This credential is capable of authenticating as a service principal using a client secret or a certificate, or as @@ -45,7 +46,7 @@ class EnvironmentCredential(AsyncContextManager): when no value is given. """ - def __init__(self, **kwargs: "Any") -> None: + def __init__(self, **kwargs: "Any") -> None: # pylint:disable=super-init-not-called self._credential = None # type: Optional[Union[CertificateCredential, ClientSecretCredential]] if all(os.environ.get(v) is not None for v in EnvironmentVariables.CLIENT_SECRET_VARS): diff --git a/sdk/identity/azure-identity/azure/identity/aio/_credentials/managed_identity.py b/sdk/identity/azure-identity/azure/identity/aio/_credentials/managed_identity.py index 18c1b7a9d9c5..30a41a0bc639 100644 --- a/sdk/identity/azure-identity/azure/identity/aio/_credentials/managed_identity.py +++ b/sdk/identity/azure-identity/azure/identity/aio/_credentials/managed_identity.py @@ -6,6 +6,8 @@ import os from typing import TYPE_CHECKING +from azure.core.credentials_async import AsyncTokenCredential + from .._internal import AsyncContextManager from .._internal.decorators import log_get_token_async from ... import CredentialUnavailableError @@ -14,12 +16,11 @@ if TYPE_CHECKING: from typing import Any, Optional from azure.core.credentials import AccessToken - from azure.core.credentials_async import AsyncTokenCredential _LOGGER = logging.getLogger(__name__) -class ManagedIdentityCredential(AsyncContextManager): +class ManagedIdentityCredential(AsyncContextManager, AsyncTokenCredential): """Authenticates with an Azure managed identity in any hosting environment which supports managed identities. This credential defaults to using a system-assigned identity. To configure a user-assigned identity, use one of @@ -35,7 +36,7 @@ class ManagedIdentityCredential(AsyncContextManager): :paramtype identity_config: Mapping[str, str] """ - def __init__(self, **kwargs: "Any") -> None: + def __init__(self, **kwargs: "Any") -> None: # pylint:disable=super-init-not-called self._credential = None # type: Optional[AsyncTokenCredential] if os.environ.get(EnvironmentVariables.IDENTITY_ENDPOINT): diff --git a/sdk/identity/azure-identity/setup.py b/sdk/identity/azure-identity/setup.py index 85e1909cd977..972f4469cda2 100644 --- a/sdk/identity/azure-identity/setup.py +++ b/sdk/identity/azure-identity/setup.py @@ -72,7 +72,7 @@ ), python_requires=">=3.7", install_requires=[ - "azure-core<2.0.0,>=1.11.0", + "azure-core<2.0.0,>=1.23.1", "cryptography>=2.5", "msal<2.0.0,>=1.12.0", "msal-extensions<2.0.0,>=0.3.0", diff --git a/shared_requirements.txt b/shared_requirements.txt index 3d93b1e4172f..4b5be7b85bbc 100644 --- a/shared_requirements.txt +++ b/shared_requirements.txt @@ -143,7 +143,7 @@ chardet<5,>=3.0.2 #override azure-digitaltwins-core azure-core<2.0.0,>=1.20.0 #override azure-eventhub azure-core<2.0.0,>=1.14.0 #override azure-eventhub typing-extensions>=4.0.1 -#override azure-identity azure-core<2.0.0,>=1.11.0 +#override azure-identity azure-core<2.0.0,>=1.23.1 #override azure-keyvault-administration azure-core<2.0.0,>=1.24.0 #override azure-keyvault-certificates azure-core<2.0.0,>=1.20.0 #override azure-keyvault-keys azure-core<2.0.0,>=1.24.0