• 使用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来说,中台适配器应用相当于后台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

  • 相关阅读:
    数据结构、算法、及线性表总结
    第二次博客作业: 函数+进制转换器v1.0beta
    c语言文件
    Oracle中Left Outer Join和外关联(+)的区别
    Oracle中trunc函数、round 函数、ceil函数和floor 函数的使用
    Oracle 表之间的连接 JOIN
    Oracle TRUNCATE语法
    使用Content editor webpart 为NewForm增加默认值
    Metadata serviceTaxonomyHiddenList 权限
    SQL server总是不能远程连接
  • 原文地址:https://www.cnblogs.com/fenwan/p/7884202.html
Copyright © 2020-2023  润新知