問題描述
在通過REST API的方式來管理APIM資源,需要呼叫Azure提供的management介面。而這所有的介面,都是需要有Token並且還需要正確的Token。如若不然,就會獲取到如下的錯誤:
{
"error": {
"code": "AuthenticationFailed",
"message": "Authentication failed. The 'Authorization' header is missing."
}
}
OR
{ "error": { "code": "AuthenticationFailed", "message": "Authentication failed." } }
如在官方對API呼叫的介紹中,都是需要設定 Authorization 。
缺少Token和Token錯誤的截圖(使用Postman測試呼叫Get APIM API List的介面:GET https://management.chinacloudapi.cn/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ApiManagement/service/{serviceName}/apis?api-version=2019-12-01)
本文就從 快速獲取Token 和 通過AAD Authorization URL獲取Token 兩種方式進行介紹。
問題解決
方式一: 快速的從Azure APIM門戶中獲取Token
PS: 這個方式適用於驗證Azure Management的呼叫方式,或一次性呼叫等場景。使用的Token許可權能力由當前登入Azure門戶的使用者的許可權所決定
1)登入Azure門戶,開啟API Management服務並選中其中需要操作的APIM物件。
2)點選F12,開啟瀏覽器的開發者模式,進入Networking選項卡
3)重新整理頁面,在所有請求列表中搜尋“ management.chinacloudapi.cn ”,篩選目標請求
4)在請求的 Request Body 中發現 Authorization 值。
演示動畫:
方式二: 通過AAD Authorization URL獲取Token
PS:此種方式為正確的呼叫方式,通過傳送POST請求獲取Token。可以在Coding中長期使用。由在AAD:Azure Active Directory中所使用的服務主體許可權所決定。
1)登入Azure 門戶,進入AAD頁面,選中“ App Registrations ”,然後點選“ + New registration ”按鈕
2)輸入新註冊應用的名稱 “ apimDevOpsUser ”,點選“ Register ”按鈕。註冊成功後,儲存下“Tenant”和“Application”值。
3)設定應用客戶端密碼。選擇 “ Certificates & secrets ” 目錄,點選“ + New client secret ”按鈕,根據提示生產新金鑰,然後複製出來儲存(PS: 此處的金鑰只有第一次建立時可見,此後全是*號代替,所以務必儲存下來)
4)回到APIM資源的許可權設定頁面(IAM), 為新的註冊應用賦予 Contributor 許可權。(可根據具體需要賦予許可權)
6)在Postman中使用POST方式呼叫介面:https://login.chinacloudapi.cn/{{TENANT}}/oauth2/v2.0/token
Request Type: POST Request URL: https://login.chinacloudapi.cn/{{TENANT}}/oauth2/v2.0/token Request Body: tenant:{{TENANT}} client_id:{{CLIENT}} scope:https://management.chinacloudapi.cn/.default grant_type:client_credentials client_secret:{{SECRETS}}
PS: scope是非常重要的一個引數,如APIM資源的API的URL為"https://management.chinacloudapi.cn/subscriptions/{...",所以正確的SCOPE是“ https://management.chinacloudapi.cn/.default ”
7) 傳送請求,獲取正確的Token。
演示動畫:
獲取Token後的正確呼叫截圖:
GET https://management.chinacloudapi.cn/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ApiManagement/service/{serviceName}/apis?api-version=2019-12-01 Authorization: Bearer ....................
參考資料
APIM REST API Document : Apis - Get -- https://docs.microsoft.com/en-us/rest/api/apimanagement/2019-12-01/apis/get