【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

 

相关文章
|
7天前
|
JSON 中间件 API
开发REST API3-11
开发REST API3-11
|
8天前
|
JSON JavaScript API
编写REST API
编写REST API
20 2
|
2月前
|
XML 安全 API
REST 和 SOAP API 有什么区别?
【8月更文挑战第31天】
27 0
|
2月前
|
JSON API 数据安全/隐私保护
哇塞!Django REST framework 太逆天啦!构建 API 服务从未如此轻松,你还不来试试?
【8月更文挑战第31天】Django REST framework(DRF)是基于Django框架的高效Web API开发工具,提供序列化、视图集、路由等功能,简化API构建流程。使用DRF可轻松实现数据的序列化与反序列化,并支持权限管理和认证机制以保障API安全。安装DRF只需通过`pip install djangorestframework`命令。要创建基本项目,先安装Django并创建新应用,定义模型、序列化器及视图集,最后配置路由。测试API时,可通过Postman发送HTTP请求验证功能。无论项目大小,DRF均能提供强大支持。
26 0
|
2月前
|
中间件 API 网络架构
Django后端架构开发:从匿名用户API节流到REST自定义认证
Django后端架构开发:从匿名用户API节流到REST自定义认证
18 0
|
2月前
|
机器人 API Python
智能对话机器人(通义版)会话接口API使用Quick Start
本文主要演示了如何使用python脚本快速调用智能对话机器人API接口,在参数获取的部分给出了具体的获取位置截图,这部分容易出错,第一次使用务必仔细参考接入参数获取的位置。
121 1
|
11天前
|
安全 API 开发者
Web 开发新风尚!Python RESTful API 设计与实现,让你的接口更懂开发者心!
在当前的Web开发中,Python因能构建高效简洁的RESTful API而备受青睐,大大提升了开发效率和用户体验。本文将介绍RESTful API的基本原则及其在Python中的实现方法。以Flask为例,演示了如何通过不同的HTTP方法(如GET、POST、PUT、DELETE)来创建、读取、更新和删除用户信息。此示例还包括了基本的路由设置及操作,为开发者提供了清晰的API交互指南。
45 6
|
2月前
|
存储 JSON API
淘系API接口(解析返回的json数据)商品详情数据解析助力开发者
——在成长的路上,我们都是同行者。这篇关于商品详情API接口的文章,希望能帮助到您。期待与您继续分享更多API接口的知识,请记得关注Anzexi58哦! 淘宝API接口(如淘宝开放平台提供的API)允许开发者获取淘宝商品的各种信息,包括商品详情。然而,需要注意的是,直接访问淘宝的商品数据API通常需要商家身份或开发者权限,并且需要遵循淘宝的API使用协议。
淘系API接口(解析返回的json数据)商品详情数据解析助力开发者
|
2月前
|
SQL 存储 数据处理
|
2月前
|
XML JSON API
RESTful API设计最佳实践:构建高效、可扩展的接口
【8月更文挑战第17天】RESTful API设计是一个涉及多方面因素的复杂过程。通过遵循上述最佳实践,开发者可以构建出更加高效、可扩展、易于维护的API。然而,值得注意的是,最佳实践并非一成不变,随着技术的发展和业务需求的变化,可能需要不断调整和优化API设计。因此,保持对新技术和最佳实践的关注,是成为一名优秀API设计师的关键。
下一篇
无影云桌面