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

【转】使用Azure Rest API获得Access Token介绍相关推荐

  1. REST API 基于ACCESS TOKEN 的权限解决方案

    REST API 基于ACCESS TOKEN 的权限解决方案 参考文章: (1)REST API 基于ACCESS TOKEN 的权限解决方案 (2)https://www.cnblogs.com/ ...

  2. 如何获取微信API的Access Token

    进入微信公众平台,点击公众平台测试帐号: 得到appID和app secret: 使用url:https://api.weixin.qq.com/cgi-bin/token?grant_type=cl ...

  3. Python 技术篇-百度语音API鉴权认证获取Access Token实例演示

    百度语音官方鉴权认证文档 下面来为大家进行鉴权认证获取Access Token的演示: 首先需要创建自己的个人语音应用,在应用列表里进行创建. 百度语音个人应用列表 然后用这个应用里的 API Key ...

  4. oracle access manager token,Laravel 自带的 API 守卫驱动 token 使用详解

    在Laravel框架中,默认的用户认证守卫有两个,web和api,web守卫默认的驱动是session,而api守卫默认的驱动是token.那么,该如何使用这个token驱动? 寻找 TokenGua ...

  5. SAP Data Intelligence API如何获得Access Token - no authentication means found

    试图使用postman访问SAP Data Intelligence graph API时,遇到401 unauthorized的错误: no authentication means found A ...

  6. php对接百度网盘开发平台API开发高级实战案例解析:(环境部署、php封装类、Access Token获取、预上传、分片上传)

    文章目录 前言 一.环境部署 1.封装BdPan类库 2.回调地址配置 二.获取授权码Code 1.手动获取Code 2.生成本地token 3.读取AccessToken凭证 4.爬虫函数 二.简化 ...

  7. 使用async,await关键字进行API Access Token的获取

    直接上代码: const request = require('request-promise-native');var config = require('../config.js');async ...

  8. ACCESS TOKEN

    Access Token 在微信公众平台接口开发中,Access Token占据了一个很重要的地位,相当于进入各种接口的钥匙,拿到这个钥匙才有调用其他各种特殊接口的权限. access_token是公 ...

  9. 微信公众平台开发(26) ACCESS TOKEN

    本文介绍微信公众平台下Access Token的概念及获取方法. 一.Access Token access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token.正常 ...

最新文章

  1. 修改initrd做miniLinux
  2. 自学python 知乎-马哥教育官网-专业Linux培训班,Python培训机构
  3. Nginx的可视化神器nginx-gui的下载配置和使用
  4. oracle_sid只能有一个吗_第一次考教资!这些问题你都了解了吗?
  5. 关于Kernel的思考
  6. 凝胶成像文件行业调研报告 - 市场现状分析与发展前景预测
  7. Win8 Metro(C#)数字图像处理--2.39二值图像投影
  8. Docker学习笔记:Centos7镜像时区修改
  9. JMeter的取样器
  10. 服务机器人工程师(ROS)要求汇总220331
  11. winAUTOPWN2.8更新下载
  12. 解决KETTLE9 连接MYSQL 8 Error connecting to database: (using class org.gjt.mm.mysql.Driver)
  13. 伪装成抖音国际版Tiktok的短信蠕虫(病毒分析)
  14. 工作电路简单到令人发指的蓝牙芯片,一起看看
  15. 小米路由器同一wifi局域网下,各主机无法ping连
  16. c++串口配置及DCB结构体
  17. 微信官方多端框架Donut可将小程序编译成 Android 以及 iOS 应用了
  18. 计算机英语这门课上后感1000,英语教师听课心得体会作文
  19. java画图板之平面山水画(二)
  20. 关于假如有Thread1、Thread2、Thread3、Thread4四条线程分别统计C、D、E、F四个盘的大小,所有线程都统计完毕交给Thread5线程去做汇总,应当如何实现?

热门文章

  1. 分布式和集群区别以及分布式事务
  2. Arduino学习笔记24
  3. jenkins Auth fail验证失败
  4. guava之cache
  5. iOS项目开发— CoreLocation的定位服务和地理编码与发编码实现
  6. Servlet JSP系列文章总结
  7. NCBI SRA数据预处理
  8. 话说Python:非主流编程语言
  9. [Leedcode][JAVA][第394题][字符串解码][栈][类型转换]
  10. CodeForces 799B (B) T-shirt buying