Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit b299320

Browse files
authored
Add user-agent to credential pipelines (Azure#9077)
1 parent 39244d4 commit b299320

20 files changed

+238
-27
lines changed

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,16 @@
1414
from azure.core.pipeline import Pipeline
1515
from azure.core.pipeline.policies import (
1616
ContentDecodePolicy,
17+
DistributedTracingPolicy,
1718
HttpLoggingPolicy,
1819
NetworkTraceLoggingPolicy,
1920
ProxyPolicy,
2021
RetryPolicy,
21-
DistributedTracingPolicy,
22+
UserAgentPolicy,
2223
)
2324
from azure.core.pipeline.transport import RequestsTransport, HttpRequest
2425
from ._constants import AZURE_CLI_CLIENT_ID, KnownAuthorities
26+
from ._internal.user_agent import USER_AGENT
2527

2628
try:
2729
ABC = abc.ABC
@@ -177,6 +179,7 @@ def __init__(
177179
config = config or self._create_config(**kwargs)
178180
policies = policies or [
179181
ContentDecodePolicy(),
182+
config.user_agent_policy,
180183
config.proxy_policy,
181184
config.retry_policy,
182185
config.logging_policy,
@@ -211,4 +214,5 @@ def _create_config(**kwargs):
211214
config.logging_policy = NetworkTraceLoggingPolicy(**kwargs)
212215
config.retry_policy = RetryPolicy(**kwargs)
213216
config.proxy_policy = ProxyPolicy(**kwargs)
217+
config.user_agent_policy = UserAgentPolicy(base_user_agent=USER_AGENT, **kwargs)
214218
return config

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,12 @@
1414
HttpLoggingPolicy,
1515
NetworkTraceLoggingPolicy,
1616
RetryPolicy,
17+
UserAgentPolicy,
1718
)
1819

1920
from .._authn_client import AuthnClient
2021
from .._constants import Endpoints, EnvironmentVariables
22+
from .._internal.user_agent import USER_AGENT
2123

2224
try:
2325
from typing import TYPE_CHECKING
@@ -72,6 +74,7 @@ def __init__(self, endpoint, client_cls, config=None, client_id=None, **kwargs):
7274
policies = [
7375
ContentDecodePolicy(),
7476
config.headers_policy,
77+
config.user_agent_policy,
7578
config.retry_policy,
7679
config.logging_policy,
7780
DistributedTracingPolicy(**kwargs),
@@ -96,6 +99,7 @@ def _create_config(**kwargs):
9699
# Metadata header is required by IMDS and in Cloud Shell; App Service ignores it
97100
config.headers_policy = HeadersPolicy(base_headers={"Metadata": "true"}, **kwargs)
98101
config.logging_policy = NetworkTraceLoggingPolicy(**kwargs)
102+
config.user_agent_policy = UserAgentPolicy(base_user_agent=USER_AGENT, **kwargs)
99103

100104
return config
101105

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,12 @@
1616
NetworkTraceLoggingPolicy,
1717
ProxyPolicy,
1818
RetryPolicy,
19+
UserAgentPolicy,
1920
)
2021
from azure.core.pipeline.transport import HttpRequest, RequestsTransport
2122

23+
from .user_agent import USER_AGENT
24+
2225
try:
2326
from unittest import mock
2427
except ImportError: # python < 3.3
@@ -80,12 +83,14 @@ def _create_config(**kwargs):
8083
config.logging_policy = NetworkTraceLoggingPolicy(**kwargs)
8184
config.retry_policy = RetryPolicy(**kwargs)
8285
config.proxy_policy = ProxyPolicy(**kwargs)
86+
config.user_agent_policy = UserAgentPolicy(base_user_agent=USER_AGENT, **kwargs)
8387
return config
8488

8589
def _build_pipeline(self, config=None, policies=None, transport=None, **kwargs):
8690
config = config or self._create_config(**kwargs)
8791
policies = policies or [
8892
ContentDecodePolicy(),
93+
config.user_agent_policy,
8994
config.proxy_policy,
9095
config.retry_policy,
9196
config.logging_policy,
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# ------------------------------------
2+
# Copyright (c) Microsoft Corporation.
3+
# Licensed under the MIT License.
4+
# ------------------------------------
5+
import platform
6+
7+
from .._version import VERSION
8+
9+
USER_AGENT = "azsdk-python-identity/{} Python/{} ({})".format(VERSION, platform.python_version(), platform.platform())

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

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

2122
from .._authn_client import AuthnClientBase
23+
from .._internal.user_agent import USER_AGENT
2224

2325
if TYPE_CHECKING:
2426
from typing import Any, Dict, Iterable, Mapping, Optional
@@ -40,6 +42,7 @@ def __init__(
4042
config = config or self._create_config(**kwargs)
4143
policies = policies or [
4244
ContentDecodePolicy(),
45+
config.user_agent_policy,
4346
config.proxy_policy,
4447
config.retry_policy,
4548
config.logging_policy,
@@ -72,4 +75,5 @@ def _create_config(**kwargs: "Any") -> Configuration:
7275
config.logging_policy = NetworkTraceLoggingPolicy(**kwargs)
7376
config.retry_policy = AsyncRetryPolicy(**kwargs)
7477
config.proxy_policy = ProxyPolicy(**kwargs)
78+
config.user_agent_policy = UserAgentPolicy(base_user_agent=USER_AGENT, **kwargs)
7579
return config

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,12 @@
1616
HttpLoggingPolicy,
1717
NetworkTraceLoggingPolicy,
1818
ProxyPolicy,
19+
UserAgentPolicy,
1920
)
2021
from azure.core.pipeline.transport import AioHttpTransport, HttpRequest
2122

22-
from azure.identity._internal import MsalTransportResponse
23+
from ..._internal import MsalTransportResponse
24+
from ..._internal.user_agent import USER_AGENT
2325

2426
if TYPE_CHECKING:
2527
# pylint:disable=unused-import
@@ -41,6 +43,7 @@ def __init__(
4143

4244
config = config or self._create_config(**kwargs)
4345
policies = policies or [
46+
config.user_agent_policy,
4447
config.proxy_policy,
4548
config.retry_policy,
4649
config.logging_policy,
@@ -118,4 +121,5 @@ def _create_config(**kwargs: "Any") -> Configuration:
118121
config.proxy_policy = ProxyPolicy(**kwargs)
119122
config.logging_policy = NetworkTraceLoggingPolicy(**kwargs)
120123
config.retry_policy = AsyncRetryPolicy(**kwargs)
124+
config.user_agent_policy = UserAgentPolicy(base_user_agent=USER_AGENT, **kwargs)
121125
return config

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,14 @@ def assert_matches(self, request):
9292
for param, expected_value in self.required_params.items():
9393
assert request.query.get(param) == expected_value
9494
for header, expected_value in self.required_headers.items():
95-
assert request.headers.get(header) == expected_value
95+
actual = request.headers.get(header)
96+
if header.lower() == "user-agent":
97+
# UserAgentPolicy appends the value of $AZURE_HTTP_USER_AGENT, which is set in pipelines.
98+
assert expected_value in actual
99+
else:
100+
assert actual == expected_value, "expected header '{}: {}', actual value was '{}'".format(
101+
header, expected_value, actual
102+
)
96103
for field, expected_value in self.required_data.items():
97104
assert request.body.get(field) == expected_value
98105

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

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@
55
from azure.core.credentials import AccessToken
66
from azure.core.pipeline.policies import SansIOHTTPPolicy
77
from azure.identity import AuthorizationCodeCredential
8+
from azure.identity._internal.user_agent import USER_AGENT
89

9-
from helpers import build_aad_response, mock_response
10+
from helpers import build_aad_response, mock_response, Request, validating_transport
1011

1112
try:
1213
from unittest.mock import Mock
@@ -29,6 +30,19 @@ def send(*_, **__):
2930
assert policy.on_request.called
3031

3132

33+
def test_user_agent():
34+
transport = validating_transport(
35+
requests=[Request(required_headers={"User-Agent": USER_AGENT})],
36+
responses=[mock_response(json_payload=build_aad_response(access_token="**"))],
37+
)
38+
39+
credential = AuthorizationCodeCredential(
40+
"tenant-id", "client-id", "auth-code", "http://localhost", transport=transport
41+
)
42+
43+
credential.get_token("scope")
44+
45+
3246
def test_auth_code_credential():
3347
client_id = "client id"
3448
tenant_id = "tenant"

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

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,11 @@
88
from azure.core.credentials import AccessToken
99
from azure.core.exceptions import ClientAuthenticationError
1010
from azure.core.pipeline.policies import SansIOHTTPPolicy
11+
from azure.identity._internal.user_agent import USER_AGENT
1112
from azure.identity.aio import AuthorizationCodeCredential
1213
import pytest
1314

14-
from helpers import build_aad_response, mock_response
15+
from helpers import async_validating_transport, build_aad_response, mock_response, Request
1516

1617

1718
@pytest.mark.asyncio
@@ -30,6 +31,20 @@ async def send(*_, **__):
3031
assert policy.on_request.called
3132

3233

34+
@pytest.mark.asyncio
35+
async def test_user_agent():
36+
transport = async_validating_transport(
37+
requests=[Request(required_headers={"User-Agent": USER_AGENT})],
38+
responses=[mock_response(json_payload=build_aad_response(access_token="**"))],
39+
)
40+
41+
credential = AuthorizationCodeCredential(
42+
"tenant-id", "client-id", "auth-code", "http://localhost", transport=transport
43+
)
44+
45+
await credential.get_token("scope")
46+
47+
3348
@pytest.mark.asyncio
3449
async def test_auth_code_credential():
3550
client_id = "client id"

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

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@
77

88
from azure.core.pipeline.policies import ContentDecodePolicy, SansIOHTTPPolicy
99
from azure.identity import CertificateCredential
10+
from azure.identity._internal.user_agent import USER_AGENT
1011
from six.moves.urllib_parse import urlparse
11-
from helpers import build_aad_response, urlsafeb64_decode, mock_response
12+
13+
from helpers import build_aad_response, urlsafeb64_decode, mock_response, Request, validating_transport
1214

1315
try:
1416
from unittest.mock import Mock, patch
@@ -33,6 +35,17 @@ def send(*_, **__):
3335
assert policy.on_request.called
3436

3537

38+
def test_user_agent():
39+
transport = validating_transport(
40+
requests=[Request(required_headers={"User-Agent": USER_AGENT})],
41+
responses=[mock_response(json_payload=build_aad_response(access_token="**"))],
42+
)
43+
44+
credential = CertificateCredential("tenant-id", "client-id", CERT_PATH, transport=transport)
45+
46+
credential.get_token("scope")
47+
48+
3649
def test_request_url():
3750
authority = "authority.com"
3851
tenant_id = "expected_tenant"

0 commit comments

Comments
 (0)