0

我正在尝试使用 REST API 自动下载 Azure 消费信息。
我修改了返回订阅列表的示例。
我更改了网址并添加了几个附加参数。

import adal
import requests

authentication_endpoint = 'https://login.microsoftonline.com/'
resource  = 'https://management.core.windows.net/'
application_id = '4c681786-980d-44cb-89f9-123456789012'
application_secret = 'xxxxxxxxxxxxxxxxxxxxxxx'
tenant_id = 'xxxxxxxxx-xxxx-xxxx-xxxx-123456789012'
enrollmentNumber = 'XXXXXXXX'

# get an Azure access token using the adal library
context = adal.AuthenticationContext(authentication_endpoint + tenant_id)
token_response = context.acquire_token_with_client_credentials(resource, application_id, application_secret)

access_token = token_response.get('accessToken')

# endpoint = 'https://management.azure.com/subscriptions/?api-version=2015-01-01'
scope = '/providers/Microsoft.Billing/enrollmentAccounts/' + enrollmentNumber
endpoint = 'https://management.azure.com' + scope + '/providers/Microsoft.Consumption/usageDetails?api-version=2019-10-01'

headers = {"Authorization": 'Bearer ' + access_token}
json_output = requests.get(endpoint,headers=headers).json()
print(json_output)

我收到一个错误,而不是带有消费信息的 json:

Puid is null/empty. Puid must be present in the header for user to get authorized.

使用相同的令牌,我可以获得所有订阅的列表。

4

1 回答 1

0

我已查看您的请求并根据调查结果,请注意 PUID 是特定于用户对象的属性,Azure AD 中的服务主体没有 PUID。但是,计费平台很可能需要有权读取计费数据的用户的 PUID。

需要以下标题。

x-ms-client-tenant-id :
x-ms-client-object-id :
x-ms-client-principal-id:

哪些客户端无法设置这些标头。当他们进行 ARM 调用时,这些标头由系统设置。错误表明此标头丢失,这意味着调用是在应用程序(AAD 应用程序或服务主体)的上下文中进行的。目前,管理组范围不支持此功能

我建议您尝试使用管理 api 使用 User Credential 。

或者,您必须在 azure AAD 租户中使用本机客户端应用程序来访问计费 api,有关更多信息,请查看以下链接:

https://github.com/Azure-Samples/billing-dotnet-usage-api#step-1-configure-a-native-client-application-in-your-aad-tenant

希望能帮助到你。

于 2019-12-03T06:01:44.683 回答