使用Azure Rest API获得Access Token介绍

1. 前言

本文主要描述了以java应用为客户端,使用Azure Rest接口的认证过程,帮助快速完成使用Azure Rest接口的第一步。

2. 读者

本文适合开发人员、IT运维人员阅读。

3. 方案架构说明

在我负责的某大型国企客户提出的混合云战略是:不仅要建立一个私有云,还要积极引入多家公有云,为下属各子公司提供多种方式的上云选择,支持企业互联网+转型的业务发展目标。

基于这个战略,该客户的主要需求是:
a. 建立一个企业范围内的统一云计算服务门户,实现各级用户访问云服务入口的统一
b 云计算服务门户与私有云,以及多家公有云对接,用户可以在云门户上购买来自不同云厂商提供的云服务
c. 各家云厂商向云门户系统提供服务使用计量数据,由云门户按照成本中心生成账单,再由各家成本中心支付费用
d. 在云门户上可以实现对申请后的云服务管理和控制

方案架构描述:规划设计开发一个中台应用,负责将Azure的服务接口转换成满足客户云门户产品需求规格的接口。由于Azure提供的Rest接口比SDK API的资料更详尽,且Rest接口本身更简洁,近年来已经成为最主要的 Web 服务设计模式,因此,中台与Azure之间采用Azure Rest接口对接。

方案架构图如下图所示:

使用Azure Rest API获得Access Token介绍_第1张图片

对后台Azure来说,中台适配器应用相当于后台Azure的客户端,是服务的消费者,后台Azure是服务端,是服务的提供者。

客户端在在调用服务端接口时,需要通过登录服务端,认证通过后获得一个基于 AAD 的认证 Token,才能够继续使用服务端提供的服务。

在进一步讨论Rest接口登录认证之前,让我们先简单了解一下Rest请求/应答接口的5个组成部分:

a. 资源地址URI: {URI-scheme} :// {URI-host} / {resource-path} ? {query-string}   # 注意,使用世纪互联Azure云提供的Rest接口,URI-host是https://XXXX.chinacloudapi.cn
b.HTTP request message header
c.HTTP request message body
d.HTTP response message header
e.HTTP response message body

4.Rest接口登录认证

为确保访问的安全性,客户端需要登录服务端获得访问token后,才能使用token继续后续访问请求。

4.1 OAuth 2.0 协议

中台和后台之间采用OAuth 2.0 协议的授权访问。OAuth协议的基本思路如下图所示:

使用Azure Rest API获得Access Token介绍_第2张图片

协议的基本流程如下:
(1) Client请求RO的授权,请求中一般包含:要访问的资源路径,操作类型,Client的身份等信息。
(2) RO批准授权,并将“授权证据”发送给Client。
(3) Client向AS请求“访问令牌(Access Token)”。此时,Client需向AS提供RO的“授权证据”,以及Client自己身份的凭证。
(4) AS验证通过后,向Client返回“访问令牌”。访问令牌也有多种类型,若为bearer类型,那么谁持有访问令牌,谁就能访问资源。
(5) Client携带“访问令牌”访问RS上的资源。在令牌的有效期内,Client可以多次携带令牌去访问资源。
(6) RS验证令牌的有效性,比如是否伪造、是否越权、是否过期,验证通过后,才能提供服务。

在本方案中,Azure Active Directory就是AS。


4.2 Java代码方式获取认证授权 Token

从登录用户角度,有两种类型用户可以实现中台应用登录后台Azure,获取访问Token。

4.2.1 以订阅账户方式登录获取Token

RESTAPI: https://login.chinacloudapi.cn/common/oauth2/token?api-version=1.0
Method: POST
HEADER: Content-Type: application/x-www-form-urlencoded
POST DATA:

  • grant_type: password  # 固定值
  • resource: https://management.core.chinacloudapi.cn/  # 固定值
  • username: 订阅登录账户
  • password: 订阅登录密码
  • client_id:  1950a258-227b-4e31-a9cf-717495945fc2            # 固定值

Postman 测试:

 使用Azure Rest API获得Access Token介绍_第3张图片

小贴士:获取client_id的办法,在powershell中执行Login-AzureRmAccount -Environment AzureChinaCloud –DEBUG命令,输入登录账户和密码后,找到DEBUG: [Common.Authentication这一行,然后找到你账户所对应的client_id。

 

 

4.2.2 以应用方式登录获取Token1.首先需要完成应用注册

1. 首先需要完成应用注册

a)登录 Azure 账户
az cloud set -n AzureChinaCloud
azure login -e AzureChinaCloud -u [email protected] -p Dst910630
b)在AAD中注册应用
az ad app create --display-name "wfexampleapp" --homepage "https://www.wangfengapp.com" --identifier-uris "https://www.wangfengapp.com/example" --password th7598nf
c)创建服务主体(service principle)
az ad sp create --id 2ab7ae13-eaa8-45ad-ab7e-045d837c5906  #在b步骤获得的appID
d)分配角色
az role assignment create --assignee 298c8763-61bf-4716-888f-a6e16ad59cbb --role Owner --scope /subscriptions/d0a61681-0f6a-4e42-a7c4-739bd7b821f7
#在c步骤获得的ObjectID
e)生成访问密钥

 使用Azure Rest API获得Access Token介绍_第4张图片

使用Azure Rest API获得Access Token介绍_第5张图片

持续时间建议选择永不过期,保存后,一定要复制密钥,否则退出后再进来密钥因隐藏而无法复制。

2.调用REST接口获取Token

RESTAPI:https://login.chinacloudapi.cn//oauth2/token?api-version=1.0
Method: POST
HEADER: Content-Type: application/x-www-form-urlencoded
POST DATA:

  • grant_type=client_credentials
  • resource=https://management.chinacloudapi.cn/
  • client_id=              # 注册应用的appID
  • client_secret=       # 注册应用的密钥

Postman 测试:

 使用Azure Rest API获得Access Token介绍_第6张图片

5.总结

根据我的经验,两种获取Token的方法没有本质上的不同,从实际使用角度来看,方式2采取了注册应用+密钥方式获取Token,比方式1要安全些。

根据规划,客户的云门户与Azure的账户体系对应如下:

将来不管采取哪种方式获取Token,当企业管理员在Azure上建立一个订阅后,都需要继续配置该订阅的访问控制列表,增加登录账户或者登录应用对该订阅的owner权限,否则中台应用将无法在该订阅下建立资源。

由于Token缺省有效期1小时,需要在中台继续研究Token的保存以及重新获取方案,且在高并发请求下密钥的管理办法。另外,在当前的AAD Preview版有关于Token生存期可配置新功能,但还不稳定,大家可以关注一下:https://docs.microsoft.com/en-us/powershell/azure/active-directory/overview?view=azureadps-2.0-preview

6. 参考资料

1. Azure Rest API:https://docs.microsoft.com/zh-cn/rest/api/
2. 针对开发人员的 Azure Active Directory:https://docs.microsoft.com/zh-cn/azure/active-directory/develop/active-directory-developers-guide
3. 使用 Azure CLI 创建服务主体来访问资源:https://docs.azure.cn/zh-cn/azure-resource-manager/resource-group-authenticate-service-principal-cli#create-service-principal-with-password
4. 使用 REST 接口获取订阅下虚拟机信息:https://docs.azure.cn/zh-cn/articles/azure-operations-guide/virtual-machines/aog-virtual-machines-get-sub-via-rest-api

 

你可能感兴趣的:(使用Azure Rest API获得Access Token介绍)