【转】使用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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/437680.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flume-ng 高可用搭建-与测试

前提&#xff1a; 1)五台虚拟机&#xff08;三台也可以&#xff09; 2)flume单节点测试并学会 3)hadoop集群搭建完成 Flume NG集群&#xff0c;架构图 Flume的存储可以支持多种&#xff0c;这里只列举了HDFS 角色分配 名称HOST角色Agent1chun1Web ServerAgent2chun2Web Ser…

【转】D365 FO第三方集成(一)---访问认证(应用注册)

从Axapta3.0的COM Business Connector&#xff0c;到AX4.0和AX2009的 .NET Business Connector&#xff0c;到AX2012的WCF Services&#xff0c;最后到D365FO的接口方式。 AX的接口演化&#xff0c;几乎见证了微软整个技术栈的变迁。 D365 FO的Web Services比起AX2012有了飞跃&…

【转】Postman系列一:Postman安装及使用过程中遇到的问题

一&#xff1a;Postman的简介、下载安装及界面说明 1.Postman的简单介绍 Postman是一款强大的网页调试和发送网页HTTP请求的工具&#xff0c;Postman让开发和测试人员做API&#xff08;接口&#xff09;测试变得更加简单。在我使用Postman之前还有一个版本&#xff0c;就是需要…

Python 数据分析三剑客之 Pandas(十):数据读写

CSDN 课程推荐&#xff1a;《迈向数据科学家&#xff1a;带你玩转Python数据分析》&#xff0c;讲师齐伟&#xff0c;苏州研途教育科技有限公司CTO&#xff0c;苏州大学应用统计专业硕士生指导委员会委员&#xff1b;已出版《跟老齐学Python&#xff1a;轻松入门》《跟老齐学Py…

COVID-19 肺炎疫情数据实时监控(python 爬虫 + pyecharts 数据可视化 + wordcloud 词云图)

文章目录【1x00】前言【2x00】思维导图【3x00】数据结构分析【4x00】主函数 main()【5x00】数据获取模块 data_get【5x01】初始化函数 init()【5x02】中国总数据 china_total_data()【5x03】全球总数据 global_total_data()【5x04】中国每日数据 china_daily_data()【5x05】境外…

【转】Postman系列二:Postman中get接口实战讲解(接口测试介绍,接口测试流程,头域操作)

一&#xff1a;接口测试介绍 接口测试&#xff1a;就是针对软件对外提供服务的接口输入输出进行测试&#xff0c;以及接口间相互逻辑的测试&#xff0c;验证接口功能和接口描述文档的一致性。 接口测试好处&#xff1a;接口测试通常能对系统测试的更为彻底&#xff0c;更高的保…

Python3 爬虫实战 — 前程无忧招聘信息爬取 + 数据可视化

爬取时间&#xff1a;2020-07-11&#xff08;2020年10月测试&#xff0c;增加了反爬&#xff0c;此代码已失效&#xff01;&#xff01;&#xff01;&#xff09;实现目标&#xff1a;根据用户输入的关键字爬取相关职位信息存入 MongoDB&#xff0c;读取数据进行可视化展示。涉…

【转】Postman系列三:Postman中post接口实战(上传文件、json请求)

一&#xff1a;接口测试过程中GET请求与POST请求的主要区别 从开发角度我们看get与post的主要区别是&#xff1a; 1.Get是用来从服务器上获得数据&#xff0c;而Post是用来向服务器上传递数据&#xff1b; 2.Get安全性比Post低&#xff1a;Get将表单中数据的按照keyvalue的形式…

Hadoop datanode正常启动,但是jps差不多datanode进程,而且Live nodes中却缺少节点

启动时可以看到启动成功&#xff0c;但是在chun2&#xff0c;jps的时候却没有了datanode进程&#xff0c;而且web端Live nodes也缺少了 百度搜索之后查到是因为hdfs.site.xml配置文件里dfs.data.dir配置的路径重复&#xff0c;就是多个节点存放data数据的目录路径相同了&#x…

【转】Postman系列四:Postman接口请求设置环境变量和全局变量、测试沙箱和测试断言、测试集运行与导入数据文件

一&#xff1a;Postman中接口请求设置环境变量和全局变量 全局变量和环境变量可以通过Pre-request Script和Tests设置&#xff0c;会在下面测试沙箱和测试断言中讲到。 全局变量的设置&#xff1a;官网参考https://learning.getpostman.com/docs/postman/environments_and_glob…

Python 算法之递归与尾递归,斐波那契数列以及汉诺塔的实现

文章目录递归概念递归要素递归与迭代的区别示例一&#xff1a;阶乘示例二&#xff1a;斐波那契数列示例三&#xff1a;汉诺塔问题尾递归Python 中尾递归的解决方案递归概念 递归&#xff1a;程序调用自身的编程技巧称为递归&#xff08; recursion&#xff09;。用一种通俗的话…

【转】Postman系列五:Postman中电商网站cookie、token检验与参数传递实战

一&#xff1a;Postman中电商网站cookie实战 Postman接口请求使用cookie两种方式&#xff1a; 1.直接在header&#xff08;头域&#xff09;中添加cookie&#xff0c;适用于已知请求cookie头域的情况 2.使用Postman的cookie管理机制&#xff0c;即可以手动添加&#xff0c;同时…

Python 数据结构之栈的实现

文章目录栈的概念栈的特点栈的操作Python 实现栈栈的简单应用&#xff1a;括号匹配问题栈的简单应用&#xff1a;倒序输出一组元素栈的概念 栈&#xff08;stack&#xff09;又名堆栈&#xff0c;栈是一种线性数据结构&#xff0c;用先进后出或者是后进先出的方式存储数据&…

CSDN 2020 博客之星实时数据排名(Python 爬虫 + PyEcharts)

CSDN 2020 博客之星实时数据排名&#xff1a;csdn.itrhx.com CSDN 一年一度的博客之星评选开始了&#xff0c;官网地址&#xff1a;https://bss.csdn.net/m/topic/blog_star2020 &#xff0c;由于官网是按照随机编号排序的&#xff0c;没有按照票数多少排序&#xff0c;为了方便…

【转】注册Azure AD 应用程序

作者&#xff1a;陈希章 发表于2017年3月22日 在此前的文章中&#xff0c;我给大家介绍了分别用Graph 浏览器以及第三方工具&#xff08;POSTMAN&#xff09;快速体验Microsoft Graph的功能&#xff0c;其中有一个重要的环节就是&#xff0c;开发人员需要访问Microsoft Graph的…

Python + GitHub Actions 实现 CSDN 自动签到与抽奖(非 selenium 版本)

文章目录【1x00】技术栈【2x00】代码实现签到与抽奖【3x00】签到结果通知【03x01】Server 酱【03x02】企业微信【03x03】钉钉【4x00】自动签到【5x00】完整代码【6x00】如何使用【06x01】方法一&#xff1a;直接 Fork 代码&#xff08;推荐&#xff09;【06x01】方法二&#xf…

Spark安装配置

Scala基础语法学习的差不多了&#xff0c;先把spark安装上 首先官网下载解压安装后 进入到conf目录下修改文件名 修改spark-env.sh&#xff08;配置jdk路径&#xff09; export JAVA_HOME/usr/local/java/jdk1.8.0_221修改slaves&#xff08;添加子节点名&#xff09; chun…

【转】注册Azure AD 2.0 应用程序

作者&#xff1a;陈希章 发表于 2017年3月22日 上一篇 介绍了Microsoft Graph应用程序的一些概念&#xff0c;以及目前还比较普遍的Azure AD 1.0应用程序的注册方式。但正如我多次提到的那样&#xff0c;虽然目前功能还在不断完善&#xff0c;但Azure AD 2.0会逐渐成为主流&…

Python 采集 Facebook 评论插件、留言外挂程序

实现时间&#xff1a;2021-05-30实现难度&#xff1a;★★★☆☆☆实现目标&#xff1a;采集 Facebook 评论插件、留言外挂程序的所有评论。完整代码&#xff1a;https://github.com/TRHX/Python3-Spider-Practice/tree/master/CommentPlugin/facebook-comments其他爬虫实战代码…

写第一个spark程序(wordcount)

首先启动集群与spark 其次把spark目录下的README.md上传到hdfs 进入spark下的bin目录&#xff0c;运行spark-shell ./spark-shell运行 val textFile sc.textFile("hdfs://chun1:9000/spark/README.md")val wordCounts textFile.flatMap(line>line.split("…