【Azure 环境】用 PowerShell 调用 AAD Token, 以及调用Azure REST API(如资源组列表)

简介: 【Azure 环境】用 PowerShell 调用 AAD Token, 以及调用Azure REST API(如资源组列表)

问题描述

PowerShell 脚本调用Azure REST API, 但是所有的API都需要进行权限验证。要在请求的Header部分带上Authorization参数,并用来对List Resource Group接口进行授权,然后显示Resource Group的Name,Location,和ID ...

问题解答

第一步:在Azure AD中注册应用,该应用表示执行PowerShell Script的客户端拥有访问Subscription下资源的权限。如无,则会出现 AuthorizationFailed 错误,详见附录一:权限问题

  1. 在浏览器上的新标签页中打开 Azure 门户。
  2. 导航到“应用注册”以在 Active Directory 中注册应用。
  3. 选择“新注册”。 在“注册应用程序”页上,将值设置如下:
  • 将“名称”设置为一个有意义的名称。 例如,powershell-client
  • 将“支持的帐户类型”设置为“仅限此组织目录中的帐户”。
  • 选择“注册” 。
  1. 注册应用程序之后,从“概述”页复制“应用程序(客户端) ID” 和 “ 目录(tenant) ID ”。
  2. 在边侧菜单的“管理”部分下,选择“证书和机密” 。
  3. 在“证书和机密”页中,选择“客户端机密”下的“新建客户端机密”按钮 。
  • 输入“说明”。
  • 为“过期”选择任一选项。
  • 选择“添加” 。
  1. 在离开页面之前复制客户端的“机密 ID”。 稍后脚本中需要用到此值。

 

第二步:在下面脚本中替换自己的 tenantIdapplicationId secret

#===============================================
# 2021-11-14 通过Azure AD中的注册应用获取Access Token
# 
# Azure AD App Registrations: https://portal.azure.cn/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/RegisteredApps
# 【Azure Developer】使用Postman获取Azure AD中注册应用程序的授权Token,及为Azure REST API设置Authorization: https://www.cnblogs.com/lulight/p/14279338.html
#===============================================
$tenantId='xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
$applicationId='xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
$secret='-xxxx~xxxxxxxxxxxxxxxxxxxxxxxx'
$param = @{
    Uri ="https://login.chinacloudapi.cn/$tenantId/oauth2/token";
    Method = 'Post';
    Body = @{
        grant_type = 'client_credentials';
        resource = 'https://management.chinacloudapi.cn';
        client_id = $applicationId;
        client_secret = $secret
    }
}
Write-Host '调用Token接口 .. ' -ForegroundColor DarkYellow
$result = Invoke-RestMethod @param
$result
#===============================================
#
# 使用Token作为Authorization,调用Resource Groups - List: https://docs.microsoft.com/en-us/rest/api/resources/resource-groups/list
#
#===============================================
$subscriptionId = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
$token = $result.access_token
$param_rgList = @{
    Uri = "https://management.chinacloudapi.cn/subscriptions/$subscriptionId/resourcegroups?api-version=2020-06-01";
    ContentType = 'application/json';
    Method = 'GET'
    Headers = @{
        Authorization = "Bearer $token";
        host = "management.chinacloudapi.cn"
    }
}
Write-Host '调用 Resource Groups - List 接口 .. ' -ForegroundColor DarkYellow
$rgList =  Invoke-RestMethod @param_rgList
$rgList.value | Select-Object name, location, id

执行结果:

 

 

附录一:权限问题

错误消息:

Invoke-RestMethod : {"error":{"code":"AuthorizationFailed","message":"The client '0b807bf1-40db-4e0c-888f-380b9b558cf1' with object id '0b807bf1-40db-4e0c-888f-380b9b558cf1' does not have authorization 
to perform action 'Microsoft.Resources/subscriptions/resourcegroups/read' over scope '/subscriptions/a9dc7515-7692-4316-9ad4-762f383eec10' or the scope is invalid. If access was recently granted, 
please refresh your credentials."}}
At line:49 char:12
+ $rgList =  Invoke-RestMethod @param_rgList
+            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand

错误截图:

解决办法:

在门户中进入Subscriptions页面,对注册应用赋予Reader权限即可。

1) 进入Azure Subscriptions页面:https://portal.azure.cn/#blade/Microsoft_Azure_Billing/SubscriptionsBlade

2) 选中订阅,在Access Control(IAM)中对第一步中 AAD的注册应用赋予Reader权限。  

 

 

附录二:PowerShell中URL后携带参数的‘?’需要转义

因为PowerShell的变量名中后不能为符号,如 ? 等,需要添加 ` 作为转义字符(高亮部分),改为 '?。

如:

apiurl="https://management.chinacloudapi.cn/.../CloudServiceName?api-version=2015-06-01"

应修改为:

apiurl="https://management.chinacloudapi.cn/.../CloudServiceName`?api-version=2015-06-01"

 

 

 

参考资料

Resource Groups - Listhttps://docs.microsoft.com/en-us/rest/api/resources/resource-groups/list

Postman获取Azure AD中注册应用程序的授权Token,及为Azure REST API设置Authorizationhttps://www.cnblogs.com/lulight/p/14279338.html

 

相关文章
|
9月前
|
JSON 安全 API
亚马逊商品列表API秘籍!轻松获取商品列表数据
亚马逊商品列表API(SP-API)提供标准化接口,支持通过关键词、分类、价格等条件搜索商品,获取ASIN、价格、销量等信息。采用OAuth 2.0认证与AWS签名,保障安全。数据以JSON格式传输,便于开发者批量获取与分析。
|
9月前
|
API 网络安全 网络架构
【Azure APIM】解答REST API实现"禁用自签名证书的证书链验证"中的backends参数值从那里取值的问题?
本文介绍APIM服务调用后端API时因自签名证书导致500错误的解决方案。通过REST API禁用证书链验证,关键在于获取正确的backendId(即APIM中配置的Backend名称),并调用PATCH接口设置validateCertificateChain为false,从而解决SSL/TLS信任问题。
296 7
|
10月前
|
监控 算法 API
1688商品列表API数据解析
1688商品列表API支持通过关键词、价格、类目筛选商品,适用于电商分析与竞品监控,提供分钟级更新与高并发能力。支持批量获取商品信息、分页查询,附Python调用示例及完整错误处理逻辑。
|
9月前
|
数据采集 JSON API
微店API使用指南:高效获取商品列表数据
本文介绍如何使用Python爬虫调用微店item_search接口,根据关键词搜索商品并获取商品列表数据,涵盖请求方式、JSON数据解析、分页参数设置及筛选排序功能,适用于电商数据分析与竞品研究。
|
11月前
|
JSON API 数据格式
小红书商品列表API数据解析(附代码)
本内容介绍了小红书商品列表API的用途及调用方式,适用于电商分析与市场研究。接口支持HTTP GET请求,返回JSON格式商品信息,包含标题、价格、销量、商家名称等字段。文中提供了基于Python的完整请求示例,使用requests库实现,并包含请求头设置和参数传递方式,便于开发者快速集成与测试。
|
10月前
|
JSON 监控 API
京东商品数据获取新姿势:商品列表API参数全解析
京东商品列表API是京东开放平台的核心接口,支持开发者高效获取商品名称、价格、销量等信息,适用于电商分析、价格监控等场景。提供关键词搜索、分类筛选、价格区间、排序及分页功能,支持HTTPS请求,数据实时更新,单次可查询最多200个SKU,助力电商应用开发。
|
11月前
|
JSON 监控 API
抖音视频列表API秘籍!轻松获取视频列表数据
抖音视频列表API是抖音开放平台提供的核心接口,支持按关键词、分类、排序方式筛选视频,适用于内容推荐、趋势分析等场景。接口返回含视频ID、标题、播放量等50+字段,支持分页获取,通过HTTP GET请求调用,返回JSON格式数据,便于开发者快速集成与处理。需注册平台账号获取访问权限。
2542 56
|
9月前
|
JSON 监控 API
从0到1掌握京东API:商品列表获取技巧与避坑指南
京东商品列表API是京东开放平台的核心接口,支持按类目、价格、销量等多条件筛选,实时获取商品基础信息、价格、库存及促销数据。采用HTTPS协议,JSON格式返回,适用于竞品分析与价格监控。支持分页,通过MD5签名认证,保障数据安全。
|
10月前
|
API 网络架构 容器
【Azure Container App】查看当前 Container App Environment 中的 CPU 使用情况的API
在扩展 Azure Container Apps 副本时,因 Container App Environment 的 CPU 核心数已达上限(500 cores),导致扩展失败。本文介绍如何使用 `az rest` 命令调用 Azure China Cloud 管理 API,查询当前环境的 CPU 使用情况,并提供具体操作步骤及示例。
357 17