[英]How to list Azure VMs using the REST API with Oauth2?
问题
MS Azure提供了广泛的REST API 。 但是,在尝试使该API正常工作时,存在大量复杂性。 从过时的文档和不完整的文档到简单的示例不起作用,执行应该是一件容易的事情的工作反而简直是噩梦。
任务
列出使用Oauth2登录的人的可用VM所需的确切,精确,详细的步骤是什么? 例如,可以使用azure-cli完成此操作。
azure vm list
使用REST和Oauth2完成相同任务的步骤是什么?
要求
答案一定不能使用Visual Studio,PowerShell,C#,SDK或任何其他此类工具来完成此任务。 仅允许门户进行设置,并且仅允许Oauth2进行授权,并且仅允许REST API进行实际信息检索。
答案不能简单地链接到外部资源,尽管出于完整性考虑,我们鼓励外部参考。
答案可能假设用户具有Azure帐户。 它必须包括有关创建Oauth2客户端,凭证以及获取适当令牌所需的任何步骤的信息。
答案必须详细。
答案必须提供示例。 也强烈建议使用图片。
答案应该包括有关可能的错误,它们的含义以及解决这些错误的内容的信息。
首先,我们可以在azure资源门户中找到该其余API。 与Azure CLI命令azure vm list
。
我已经在本地使用http请求对其进行了测试。 这是我测试过的屏幕截图:
请求URL : https://management.azure.com/subscriptions/<subscription ID>/providers/Microsoft.Compute/virtualMachines?api-version=2016-03-30
: https://management.azure.com/subscriptions/<subscription ID>/providers/Microsoft.Compute/virtualMachines?api-version=2016-03-30
标头 :授权:承载eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI .....
因此,如果获得访问令牌,这非常重要。 下面向我们展示如何获取访问令牌。
获取令牌(POST):
请求URL : https://login.microsoftonline.com/<tenant id>/oauth2/token
: https://login.microsoftonline.com/<tenant id>/oauth2/token
体 : grant_type=client_credentials&client_id=<client id>&resource=https%3A%2F%2Fmanagement.core.windows.net%2F&client_secret=<client secret>
这是我在fildder中的屏幕截图:
我们需要在Azure广告应用程序中获取客户ID和客户机密。 有关如何在Azure AD中注册应用程序。 请看一下这篇文章: https : //docs.microsoft.com/zh-cn/azure/azure-resource-manager/resource-group-create-service-principal-portal 。
请注意:
1)我们需要在门户“所需权限”中添加“ Windows Azure服务管理API”,如以下屏幕截图所示: 2)我们需要为此服务主体分配“贡献者”。 单击订阅->访问控制->单击添加->单击“选择角色”->单击贡献者->单击添加用户->查找您在上面创建的应用程序->单击确定。
向Azure Rest API发出请求比乍一看可能要复杂一些。 特别是,在正确调整点的同时,您可能会遇到许多深奥且不太有用的错误消息。
该过程可能使术语如此混乱和困难,其中之一就是术语。 除非您了解这一点,否则很难知道如何处理错误。 我们将在这里介绍一些更常见的内容。
订阅 -这基本上就是您所期望的。 它指的是Microsoft Azure服务订阅。 它基本上是组织的顶级保护伞。
租户 -这就像一个下级组织,可能是部门或小组。 单个订阅下可以有多个租户。
用户 -如所期望的,用户是一个人。 用户仅限于租户。
应用程序 -应用程序是尝试使用API的软件程序。 必须对其进行注册和配置。
服务主体 -本质上是应用程序。 它是发出API服务请求的实体。
尽管您可能不会猜到,但这可能是该过程中最复杂的部分。 让我们从在门户中创建The Application开始。
请遵循以下单击路径: Azure Active Directory-> App Registrations-> New
应该有一个用于创建应用程序的表单,其中包含以下字段:
API Tutorial
。 创建后可以对其进行编辑。 http://123AzureApiTutorial.com/code
。 创建后可以对其进行编辑。 创建应用程序后,您应该看到一个属性Application ID
。 这是OAuth2流中使用的client_id
。 记下它的价值。
OAuth2流需要用于身份验证的客户端机密值。
要生成它,请遵循以下单击路径: Azure Active Directory-> App Registrations-> API Tutorial->所有设置->密钥输入密钥描述: API Tutorial Key
,以及持续时间: In 1 year
。
点击Save
。 这将生成键值。 您必须在此处复制值并将其保存在某处。 您将没有其他机会这样做。
该值是OAuth2流中的client_secret
。
要获得权限,请遵循以下单击路径: Azure Active Directory->应用程序注册-> API教程->所有设置->所需权限->添加
在这里,您将看到可能的API列表。 我们关心的Azure是Windows Azure Service Management API
。 当前只有一个权限: Access Azure Service Management as organization users (preview)
。 选择它,单击“ Select
,然后单击Done
。
access_token
是使我们能够针对API进行请求的原因。 有两种主要方法可以做到这一点。 我建议在尝试实施它们之前先阅读两者。
授权码是一个两步过程。 首先,我们获得授权码,然后使用它来获取access_token
。 这种方法的好处是,我们还可以返回id_token
,其中包含各种有用的声明,例如用户名,电子邮件地址等。
请求格式如下: (GET) https://login.microsoftonline.com/<tenant-id>/oauth2/authorize?client_id=<client-id>&scope=api&redirect_uri=<redirect-uri>&response_type=code&prompt=consent
。 让我们快速查看一下这里的参数。
API Tutorial
时指定的登录URL。 用户登录后,将使用查询字符串中的“ code”参数将其重定向到此URL。 admin_consent
。 好吧,因此一旦我们提出该请求,我们将被重定向到登录页面。 我们登录,接受权限,然后将我们重定向到这里: http://123AzureApiTutorial.com/code?code=SOME_REALLY_LONG_STRING_OF_CHARACTERS
: http://123AzureApiTutorial.com/code?code=SOME_REALLY_LONG_STRING_OF_CHARACTERS
。 该字符串是代码。
接下来,我们获取代码并使用它来获取access_token
。 为此,我们需要再次提出请求。
(POST) https://login.microsoftonline.com/<tenant-id>/oauth2/token
除了url,我们还需要添加参数。 这些应该与内容类型application/x-www-form-urlencoded
。 这意味着它们将作为表单参数提交。 它们如下:
client_id
client_secret
code
SOME_REALLY_LONG_STRING_OF_CHARACTERS
。 authorization_code
redirect_uri
http://123AzureApiTutorial.com/code
。 resource
https://management.azure.com
。 我们的响应将是一个具有多个字段的json对象。 其中,我们关心的是access_token。 好极了!
这种方法跳过了获取代码(因此需要redirect_uri
)的代价是没有获取id_token
。
该请求与“ 获取访问令牌”部分中的请求相同,但有一些细微差别。
redirect_uri
。 client_credentials
。 好了,我们有一个access_token
! 现在我们在做饭!
到目前为止,所有准备工作都已完成,这是该过程中最容易的部分。
我们要求使用的API URL是:
https://management.azure.com/subscriptions/<subscription-id>/providers/Microsoft.Compute/virtualMachines?api-version=2016-03-30
将以下标头添加到请求中:
Authorization: Bearer <access-token>
。 是的, access_token
值的标头值中必须带有单词“ Bearer”。
“可是等等!” 你惊呼。 “如何获取订阅ID?”
很好的问题! 要通过门户网站找到它,请单击Subscriptions->-> Overview,然后复制Subscription Id
值。
使用该值,然后运行请求。 您应该看到列出的所有虚拟机!
InvalidAuthenticationToken
发出API请求时,您会收到一个错误响应,内容如下: InvalidAuthenticationToken: The access token is invalid
。 这意味着您尚未向API Tutorial
添加API权限。 返回“ 添加正确的权限”步骤,然后仔细检查您是否具有正确的权限。 另外,在请求令牌时,请确保您使用prompt=consent
,否则将不会向您提示新的权限,并且令牌将失败。
InvalidAuthenticationTokenTenant
确保请求令牌时使用的tenant-id
属于进行API调用时使用的订户。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.