【转】使用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
【转】使用Azure Rest API获得Access Token介绍相关推荐
- REST API 基于ACCESS TOKEN 的权限解决方案
REST API 基于ACCESS TOKEN 的权限解决方案 参考文章: (1)REST API 基于ACCESS TOKEN 的权限解决方案 (2)https://www.cnblogs.com/ ...
- 如何获取微信API的Access Token
进入微信公众平台,点击公众平台测试帐号: 得到appID和app secret: 使用url:https://api.weixin.qq.com/cgi-bin/token?grant_type=cl ...
- Python 技术篇-百度语音API鉴权认证获取Access Token实例演示
百度语音官方鉴权认证文档 下面来为大家进行鉴权认证获取Access Token的演示: 首先需要创建自己的个人语音应用,在应用列表里进行创建. 百度语音个人应用列表 然后用这个应用里的 API Key ...
- oracle access manager token,Laravel 自带的 API 守卫驱动 token 使用详解
在Laravel框架中,默认的用户认证守卫有两个,web和api,web守卫默认的驱动是session,而api守卫默认的驱动是token.那么,该如何使用这个token驱动? 寻找 TokenGua ...
- SAP Data Intelligence API如何获得Access Token - no authentication means found
试图使用postman访问SAP Data Intelligence graph API时,遇到401 unauthorized的错误: no authentication means found A ...
- php对接百度网盘开发平台API开发高级实战案例解析:(环境部署、php封装类、Access Token获取、预上传、分片上传)
文章目录 前言 一.环境部署 1.封装BdPan类库 2.回调地址配置 二.获取授权码Code 1.手动获取Code 2.生成本地token 3.读取AccessToken凭证 4.爬虫函数 二.简化 ...
- 使用async,await关键字进行API Access Token的获取
直接上代码: const request = require('request-promise-native');var config = require('../config.js');async ...
- ACCESS TOKEN
Access Token 在微信公众平台接口开发中,Access Token占据了一个很重要的地位,相当于进入各种接口的钥匙,拿到这个钥匙才有调用其他各种特殊接口的权限. access_token是公 ...
- 微信公众平台开发(26) ACCESS TOKEN
本文介绍微信公众平台下Access Token的概念及获取方法. 一.Access Token access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token.正常 ...
最新文章
- 修改initrd做miniLinux
- 自学python 知乎-马哥教育官网-专业Linux培训班,Python培训机构
- Nginx的可视化神器nginx-gui的下载配置和使用
- oracle_sid只能有一个吗_第一次考教资!这些问题你都了解了吗?
- 关于Kernel的思考
- 凝胶成像文件行业调研报告 - 市场现状分析与发展前景预测
- Win8 Metro(C#)数字图像处理--2.39二值图像投影
- Docker学习笔记:Centos7镜像时区修改
- JMeter的取样器
- 服务机器人工程师(ROS)要求汇总220331
- winAUTOPWN2.8更新下载
- 解决KETTLE9 连接MYSQL 8 Error connecting to database: (using class org.gjt.mm.mysql.Driver)
- 伪装成抖音国际版Tiktok的短信蠕虫(病毒分析)
- 工作电路简单到令人发指的蓝牙芯片,一起看看
- 小米路由器同一wifi局域网下,各主机无法ping连
- c++串口配置及DCB结构体
- 微信官方多端框架Donut可将小程序编译成 Android 以及 iOS 应用了
- 计算机英语这门课上后感1000,英语教师听课心得体会作文
- java画图板之平面山水画(二)
- 关于假如有Thread1、Thread2、Thread3、Thread4四条线程分别统计C、D、E、F四个盘的大小,所有线程都统计完毕交给Thread5线程去做汇总,应当如何实现?
热门文章
- 分布式和集群区别以及分布式事务
- Arduino学习笔记24
- jenkins Auth fail验证失败
- guava之cache
- iOS项目开发— CoreLocation的定位服务和地理编码与发编码实现
- Servlet JSP系列文章总结
- NCBI SRA数据预处理
- 话说Python:非主流编程语言
- [Leedcode][JAVA][第394题][字符串解码][栈][类型转换]
- CodeForces	 799B (B) T-shirt buying