Skip to content

Commit c11e835

Browse files
xiangyan99chlowellmccoyp
authored
add interactive_browser_client_id (Azure#20591)
* add interactive_browser_client_id * Update sdk/identity/azure-identity/azure/identity/_credentials/default.py Co-authored-by: Charles Lowell <chlowe@microsoft.com> * Update sdk/identity/azure-identity/azure/identity/_credentials/default.py Co-authored-by: Charles Lowell <chlowe@microsoft.com> * update * update * update * update * update * Update sdk/identity/azure-identity/azure/identity/_credentials/default.py Co-authored-by: McCoy Patiño <39780829+mccoyp@users.noreply.github.com> * update Co-authored-by: Charles Lowell <chlowe@microsoft.com> Co-authored-by: McCoy Patiño <39780829+mccoyp@users.noreply.github.com>
1 parent aa44b02 commit c11e835

File tree

3 files changed

+28
-1
lines changed

3 files changed

+28
-1
lines changed

sdk/identity/azure-identity/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
- `OnBehalfOfCredential` supports the on-behalf-of authentication flow for
99
accessing resources on behalf of users
1010
([#19308](https://github.com/Azure/azure-sdk-for-python/issues/19308))
11+
- `DefaultAzureCredential` allows specifying the client ID of interactive browser via keyword argument `interactive_browser_client_id`
12+
([#20487](https://github.com/Azure/azure-sdk-for-python/issues/20487))
1113

1214
### Breaking Changes
1315

sdk/identity/azure-identity/azure/identity/_credentials/default.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ class DefaultAzureCredential(ChainedTokenCredential):
7070
AZURE_TENANT_ID, if any. If unspecified, users will authenticate in their home tenants.
7171
:keyword str managed_identity_client_id: The client ID of a user-assigned managed identity. Defaults to the value
7272
of the environment variable AZURE_CLIENT_ID, if any. If not specified, a system-assigned identity will be used.
73+
:keyword str interactive_browser_client_id: The client ID to be used in interactive browser credential. If not
74+
specified, users will authenticate to an Azure development application.
7375
:keyword str shared_cache_username: Preferred username for :class:`~azure.identity.SharedTokenCacheCredential`.
7476
Defaults to the value of environment variable AZURE_USERNAME, if any.
7577
:keyword str shared_cache_tenant_id: Preferred tenant for :class:`~azure.identity.SharedTokenCacheCredential`.
@@ -102,6 +104,7 @@ def __init__(self, **kwargs):
102104
managed_identity_client_id = kwargs.pop(
103105
"managed_identity_client_id", os.environ.get(EnvironmentVariables.AZURE_CLIENT_ID)
104106
)
107+
interactive_browser_client_id = kwargs.pop("interactive_browser_client_id", None)
105108

106109
shared_cache_username = kwargs.pop("shared_cache_username", os.environ.get(EnvironmentVariables.AZURE_USERNAME))
107110
shared_cache_tenant_id = kwargs.pop(
@@ -137,7 +140,14 @@ def __init__(self, **kwargs):
137140
if not exclude_powershell_credential:
138141
credentials.append(AzurePowerShellCredential(**kwargs))
139142
if not exclude_interactive_browser_credential:
140-
credentials.append(InteractiveBrowserCredential(tenant_id=interactive_browser_tenant_id, **kwargs))
143+
if interactive_browser_client_id:
144+
credentials.append(
145+
InteractiveBrowserCredential(
146+
tenant_id=interactive_browser_tenant_id, client_id=interactive_browser_client_id, **kwargs
147+
)
148+
)
149+
else:
150+
credentials.append(InteractiveBrowserCredential(tenant_id=interactive_browser_tenant_id, **kwargs))
141151

142152
super(DefaultAzureCredential, self).__init__(*credentials)
143153

sdk/identity/azure-identity/tests/test_default.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,21 @@ def validate_tenant_id(credential):
387387
validate_tenant_id(mock_credential)
388388

389389

390+
def test_interactive_browser_client_id():
391+
"""the credential should allow configuring a client ID for InteractiveBrowserCredential by kwarg"""
392+
393+
client_id = "client-id"
394+
395+
def validate_client_id(credential):
396+
assert len(credential.call_args_list) == 1, "InteractiveBrowserCredential should be instantiated once"
397+
_, kwargs = credential.call_args
398+
assert kwargs["client_id"] == client_id
399+
400+
with patch(DefaultAzureCredential.__module__ + ".InteractiveBrowserCredential") as mock_credential:
401+
DefaultAzureCredential(exclude_interactive_browser_credential=False, interactive_browser_client_id=client_id)
402+
validate_client_id(mock_credential)
403+
404+
390405
@pytest.mark.parametrize("expected_value", (True, False))
391406
def test_allow_multitenant_authentication(expected_value):
392407
"""the credential should pass "allow_multitenant_authentication" to the inner credentials which support it"""

0 commit comments

Comments
 (0)