使用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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM