如何取得 Azure Container Registry (ACR) REST API 的 Access Token

  • 161
  • 0

ACR(Azure Container Registry),Azure平台上的容器登錄服務(類似於docker hub),用於容器登錄儲存和管理容器映像和相關資源,對於有使用Azure Devops服務的團隊來說,應該不陌生。這次因為一個需求,所以試著使用ACR的RESET API來取得ACR的一些資訊,原以為操作 ACR REST API 應該滿簡單的,沒想到要取得一個Access Token需要這麼轉折一下,本篇來記錄一下取得過程的步驟。

首先ACR REST API 是採用 OAuth 2.0 作為授權驗證,因此必須先取得Token才能進行API的呼叫,而取得Token的/oauth2/token API有二個必填參數,分別是service 與 scope,其中service就是你的ACR URL(eg:contosouniversity.azurecr.io),但是scope又是什麼?原來ACR 的REST API會有不同的 scope值,這個值可以查文件(但還真不好查),最快的方式就是直接呼叫一次讓它失敗,然後從回應的 Www-Authenticate 標頭內容直接看比較快。

得到service及scope二個值之後,接著要透過Basic Auth取得Access Token,做為後續呼叫ACR REST API使用,這裡有二個方式可以使用。


方法1,透過Azure Portal,檢視ACR取得帳密,以取得ACR清單為例,必須具有管理員權限。接著利用這組帳密取得Access Token

curl -s -u '{user}:{pwd}' 'https://contosouniversity.azurecr.io/oauth2/token?service=contosouniversity.azurecr.io&scope=registry:catalog:*'
{"access_token":"eyJhbGciOiJSUzI1Ni.....Ewwrobo-CVU3R0h9aMzjrg"}

方法2,同樣透過Azure Portal,檢視ACR取得帳密,只是這次先將帳密進行Base64編碼,在Linux下你可以透過下面指令取得Base64字串,再以這個Base64字串進行Basic Auth取得Access Token

echo -n '[username]:[password]' | base64
curl -v -H 'Authorization: Basic ZWR......0ZVUTgyR0ZlMjQ=' 'https://contosouniversity.azurecr.io/oauth2/token?service=contosouniversity.azurecr.io&scope=registry:catalog:*'

順利取得Access Token之後,只要在後續呼叫ACR REST API時,加入 Authorization標頭,並放入Access Token,就可以成功呼叫 REST API,以取得ACR清單為例,可以正常取回一個JSON陣列結果

curl -s -H 'Authorization: Bearer eyJhbGc.....8yMWEwwrobo-CVU3R0h9aMzjrg' https://contosouniversity.azurecr.io/acr/v1/_catalog

要注意的是Access Token有時效性(30 min),一旦過期就必須再重新取得

參考資料 : acr/docs at main · Azure/acr · GitHub

 

若本文對您有所幫助,歡迎轉貼,但請在加註【轉貼】及來源出處,並在附上本篇的超連結,感恩您的配合囉。

By No.18