繁体   English   中英

如何使用REST API和Oauth2列出Azure VM?

[英]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请求对其进行了测试。 这是我测试过的屏幕截图: 在此处输入图片说明

请求URLhttps://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):

请求URLhttps://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发出请求比乍一看可能要复杂一些。 特别是,在正确调整点的同时,您可能会遇到许多深奥且不太有用的错误消息。

  1. 介绍和条款
  2. 设置应用程序
  3. 获取access_token
  4. 发出API请求
  5. 迄今为止的常见错误

介绍和条款

该过程可能使术语如此混乱和困难,其中之一就是术语。 除非您了解这一点,否则很难知道如何处理错误。 我们将在这里介绍一些更常见的内容。

订阅 -这基本上就是您所期望的。 它指的是Microsoft Azure服务订阅。 它基本上是组织的顶级保护伞。

租户 -这就像一个下级组织,可能是部门或小组。 单个订阅下可以有多个租户。

用户 -如所期望的,用户是一个人。 用户仅限于租户。

应用程序 -应用程序是尝试使用API​​的软件程序。 必须对其进行注册和配置。

服务主体 -本质上是应用程序。 它是发出API服务请求的实体。

设置应用

尽管您可能不会猜到,但这可能是该过程中最复杂的部分。 让我们从在门户中创建The Application开始。

创建应用程序

请遵循以下单击路径: Azure Active Directory-> App Registrations-> New

应该有一个用于创建应用程序的表单,其中包含以下字段:

  • 名称
    • 这是“应用程序”的简单名称。 进行身份验证时,它将显示给用户。 出于本“教程”的目的,我们将其称为“ API Tutorial 创建后可以对其进行编辑。
  • 应用类型
    • 应用程序的类型。 为了我们的目的,我们应该选择“ Web应用程序/ API”。 创建后无法编辑。
  • 登录网址
    • 如果我们采用“ authorization_code”路由进行登录,则将使用重定向。 这可能很有用,因为响应将包含“ id_token”。 我们稍后再讨论。 现在,让我们制作这个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

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 让我们快速查看一下这里的参数。

  • 租户编号
    • 可以使用单击路径Azure Active Directory->属性并复制目录ID来获得。 实际上,这是租户ID值。 它只是使用一个不同的名称来帮助解决整体混乱。
  • 客户编号
    • 这是我们之前检索的应用程序ID。
  • 范围
    • 这是代码的范围。 我们只想使用API​​。
  • 重定向URI
    • 这是您在创建API Tutorial时指定的登录URL。 用户登录后,将使用查询字符串中的“ code”参数将其重定向到此URL。
  • 回应类型
    • 这就是我们希望得到的回应。 我们需要授权码,因此我们只使用值码。
  • 提示
    • 这指定是否提示用户同意权限。 如果我们没有此权限,并且更改了权限,则请求将意外失败。 非常沮丧。 但是只要您不更改权限,就可以在授予权限后将其删除。 如果应用程序正在访问需要管理员许可的API,则此值应为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
    • 这又是我们已经拥有的客户端ID(应用程序ID)。
  • client_secret
    • 这是我们之前生成的应用程序密钥。 希望您能保存! 如果不是,请返回该步骤并生成另一步骤。
  • code
    • 这是我们刚刚收到的代码的值: SOME_REALLY_LONG_STRING_OF_CHARACTERS
  • `grant_type
    • 因为我们要使用授权码路由,所以该值应为authorization_code
  • redirect_uri
    • 这是我们为API教程指定的重定向uri。 我们示例中的值应为http://123AzureApiTutorial.com/code
  • resource
    • 这个非常重要。 这是我们要访问的资源API。 对于Azure API,此值为https://management.azure.com

我们的响应将是一个具有多个字段的json对象。 其中,我们关心的是access_token。 好极了!

客户凭证

这种方法跳过了获取代码(因此需要redirect_uri )的代价是没有获取id_token

该请求与“ 获取访问令牌”部分中的请求相同,但有一些细微差别。

  • 我们不需要指定redirect_uri
  • grant_type的值应更改为client_credentials

好了,我们有一个access_token 现在我们在做饭!

发出API请求

到目前为止,所有准备工作都已完成,这是该过程中最容易的部分。

我们要求使用的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM