1. 前言
本文主要描述了以java应用为客户端,使用Azure Rest接口的认证过程,帮助快速完成使用Azure Rest接口的第一步。
2. 读者
本文适合开发人员、IT运维人员阅读。
3. 方案架构说明
在我负责的某大型国企客户提出的混合云战略是:不仅要建立一个私有云,还要积极引入多家公有云,为下属各子公司提供多种方式的上云选择,支持企业互联网+转型的业务发展目标。
基于这个战略,该客户的主要需求是:
a. 建立一个企业范围内的统一云计算服务门户,实现各级用户访问云服务入口的统一
b 云计算服务门户与私有云,以及多家公有云对接,用户可以在云门户上购买来自不同云厂商提供的云服务
c. 各家云厂商向云门户系统提供服务使用计量数据,由云门户按照成本中心生成账单,再由各家成本中心支付费用
d. 在云门户上可以实现对申请后的云服务管理和控制
方案架构描述:规划设计开发一个中台应用,负责将Azure的服务接口转换成满足客户云门户产品需求规格的接口。由于Azure提供的Rest接口比SDK API的资料更详尽,且Rest接口本身更简洁,近年来已经成为最主要的 Web 服务设计模式,因此,中台与Azure之间采用Azure Rest接口对接。
方案架构图如下图所示:
对后台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协议的基本思路如下图所示:
协议的基本流程如下:
(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 测试:
小贴士:获取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 duanshiteng@duanshiteng.partner.onmschina.cn -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)生成访问密钥
持续时间建议选择永不过期,保存后,一定要复制密钥,否则退出后再进来密钥因隐藏而无法复制。
2.调用REST接口获取Token
RESTAPI:https://login.chinacloudapi.cn/<TenantID>/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=<ClientID> # 注册应用的appID
- client_secret=<ClientSceret> # 注册应用的密钥
Postman 测试:
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