Skip to content

Commit e7532e2

Browse files
authored
Add proxy policy to credential pipelines (#8945)
1 parent 86afbc1 commit e7532e2

19 files changed

Lines changed: 533 additions & 267 deletions

sdk/identity/azure-identity/HISTORY.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
# Unreleased
2+
3+
- All credential pipelines include `ProxyPolicy`
4+
([#8945](https://github.com/Azure/azure-sdk-for-python/pull/8945))
5+
6+
17
# 2019-11-27 1.1.0
28

39
- Constructing `DefaultAzureCredential` no longer raises `ImportError` on Python

sdk/identity/azure-identity/azure/identity/_authn_client.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ def __init__(
177177
config = config or self._create_config(**kwargs)
178178
policies = policies or [
179179
ContentDecodePolicy(),
180+
config.proxy_policy,
180181
config.retry_policy,
181182
config.logging_policy,
182183
DistributedTracingPolicy(**kwargs),

sdk/identity/azure-identity/azure/identity/_internal/msal_transport_adapter.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ def _build_pipeline(self, config=None, policies=None, transport=None, **kwargs):
8686
config = config or self._create_config(**kwargs)
8787
policies = policies or [
8888
ContentDecodePolicy(),
89+
config.proxy_policy,
8990
config.retry_policy,
9091
config.logging_policy,
9192
DistributedTracingPolicy(**kwargs),

sdk/identity/azure-identity/azure/identity/aio/_authn_client.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ def __init__(
4040
config = config or self._create_config(**kwargs)
4141
policies = policies or [
4242
ContentDecodePolicy(),
43+
config.proxy_policy,
4344
config.retry_policy,
4445
config.logging_policy,
4546
DistributedTracingPolicy(**kwargs),

sdk/identity/azure-identity/azure/identity/aio/_internal/msal_transport_adapter.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
DistributedTracingPolicy,
1616
HttpLoggingPolicy,
1717
NetworkTraceLoggingPolicy,
18+
ProxyPolicy,
1819
)
1920
from azure.core.pipeline.transport import AioHttpTransport, HttpRequest
2021

@@ -40,6 +41,7 @@ def __init__(
4041

4142
config = config or self._create_config(**kwargs)
4243
policies = policies or [
44+
config.proxy_policy,
4345
config.retry_policy,
4446
config.logging_policy,
4547
DistributedTracingPolicy(**kwargs),
@@ -113,6 +115,7 @@ def post(
113115
@staticmethod
114116
def _create_config(**kwargs: "Any") -> Configuration:
115117
config = Configuration(**kwargs)
118+
config.proxy_policy = ProxyPolicy(**kwargs)
116119
config.logging_policy = NetworkTraceLoggingPolicy(**kwargs)
117120
config.retry_policy = AsyncRetryPolicy(**kwargs)
118121
return config

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@
44
# ------------------------------------
55
import base64
66
import json
7-
import six
87
import time
98

9+
from azure.core.pipeline.policies import SansIOHTTPPolicy
10+
import six
11+
1012
try:
1113
from unittest import mock
1214
except ImportError: # python < 3.3
@@ -104,6 +106,11 @@ def mock_response(status_code=200, headers={}, json_payload=None):
104106
return response
105107

106108

109+
def get_discovery_response(endpoint="https://a/b"):
110+
aad_metadata_endpoint_names = ("authorization_endpoint", "token_endpoint", "tenant_discovery_endpoint")
111+
return mock_response(json_payload={name: endpoint for name in aad_metadata_endpoint_names})
112+
113+
107114
def validating_transport(requests, responses):
108115
if len(requests) != len(responses):
109116
raise ValueError("each request must have one response")

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,32 @@
33
# Licensed under the MIT License.
44
# ------------------------------------
55
from azure.core.credentials import AccessToken
6+
from azure.core.pipeline.policies import SansIOHTTPPolicy
67
from azure.identity import AuthorizationCodeCredential
78

9+
from helpers import build_aad_response, mock_response
10+
811
try:
912
from unittest.mock import Mock
1013
except ImportError: # python < 3.3
1114
from mock import Mock # type: ignore
1215

1316

17+
def test_policies_configurable():
18+
policy = Mock(spec_set=SansIOHTTPPolicy, on_request=Mock())
19+
20+
def send(*_, **__):
21+
return mock_response(json_payload=build_aad_response(access_token="**"))
22+
23+
credential = AuthorizationCodeCredential(
24+
"tenant-id", "client-id", "auth-code", "http://localhost", policies=[policy], transport=Mock(send=send)
25+
)
26+
27+
credential.get_token("scope")
28+
29+
assert policy.on_request.called
30+
31+
1432
def test_auth_code_credential():
1533
client_id = "client id"
1634
tenant_id = "tenant"

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,28 @@
77

88
from azure.core.credentials import AccessToken
99
from azure.core.exceptions import ClientAuthenticationError
10+
from azure.core.pipeline.policies import SansIOHTTPPolicy
1011
from azure.identity.aio import AuthorizationCodeCredential
1112
import pytest
1213

14+
from helpers import build_aad_response, mock_response
15+
16+
17+
@pytest.mark.asyncio
18+
async def test_policies_configurable():
19+
policy = Mock(spec_set=SansIOHTTPPolicy, on_request=Mock())
20+
21+
async def send(*_, **__):
22+
return mock_response(json_payload=build_aad_response(access_token="**"))
23+
24+
credential = AuthorizationCodeCredential(
25+
"tenant-id", "client-id", "auth-code", "http://localhost", policies=[policy], transport=Mock(send=send)
26+
)
27+
28+
await credential.get_token("scope")
29+
30+
assert policy.on_request.called
31+
1332

1433
@pytest.mark.asyncio
1534
async def test_auth_code_credential():

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

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,10 @@
55
import json
66
import os
77

8+
from azure.core.pipeline.policies import ContentDecodePolicy, SansIOHTTPPolicy
89
from azure.identity import CertificateCredential
910
from six.moves.urllib_parse import urlparse
10-
from helpers import urlsafeb64_decode, mock_response
11+
from helpers import build_aad_response, urlsafeb64_decode, mock_response
1112

1213
try:
1314
from unittest.mock import Mock, patch
@@ -17,6 +18,21 @@
1718
CERT_PATH = os.path.join(os.path.dirname(__file__), "certificate.pem")
1819

1920

21+
def test_policies_configurable():
22+
policy = Mock(spec_set=SansIOHTTPPolicy, on_request=Mock())
23+
24+
def send(*_, **__):
25+
return mock_response(json_payload=build_aad_response(access_token="**"))
26+
27+
credential = CertificateCredential(
28+
"tenant-id", "client-id", CERT_PATH, policies=[ContentDecodePolicy(), policy], transport=Mock(send=send)
29+
)
30+
31+
credential.get_token("scope")
32+
33+
assert policy.on_request.called
34+
35+
2036
def test_request_url():
2137
authority = "authority.com"
2238
tenant_id = "expected_tenant"

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

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,30 @@
77
from unittest.mock import Mock, patch
88
from urllib.parse import urlparse
99

10+
from azure.core.pipeline.policies import ContentDecodePolicy, SansIOHTTPPolicy
1011
from azure.identity.aio import CertificateCredential
11-
from helpers import urlsafeb64_decode, mock_response
12+
from helpers import build_aad_response, urlsafeb64_decode, mock_response
1213
import pytest
1314

1415
CERT_PATH = os.path.join(os.path.dirname(__file__), "certificate.pem")
1516

1617

18+
@pytest.mark.asyncio
19+
async def test_policies_configurable():
20+
policy = Mock(spec_set=SansIOHTTPPolicy, on_request=Mock())
21+
22+
async def send(*_, **__):
23+
return mock_response(json_payload=build_aad_response(access_token="**"))
24+
25+
credential = CertificateCredential(
26+
"tenant-id", "client-id", CERT_PATH, policies=[ContentDecodePolicy(), policy], transport=Mock(send=send)
27+
)
28+
29+
await credential.get_token("scope")
30+
31+
assert policy.on_request.called
32+
33+
1734
@pytest.mark.asyncio
1835
async def test_request_url():
1936
authority = "authority.com"

0 commit comments

Comments
 (0)