API 的應用程式 URL 路徑 /api/v1/getcode 會產生 JSON 回應,其中包含英數位元程式代碼和時間戳。
首先,@app.route 裝飾器會告訴 Flask,get_code 函式處理發往 /api/v1/getcode URL 的請求。
@app.route('/api/v1/getcode', methods=['GET'])
def get_code():
接下來,應用程式會呼叫第三方 API,其 URL 位於 number_url中,並提供它從標頭中的密鑰保存庫擷取的存取金鑰。
headers = {
'Content-Type': 'application/json',
'x-functions-key': access_key
}
r = requests.get(url = number_url, headers = headers)
if (r.status_code != 200):
return "Could not get you a code.", r.status_code
範例第三方 API 會部署至 Azure Functions 的無伺服器環境。 標頭中的 x-functions-key 屬性是 Azure Functions 預期存取金鑰出現在標頭中的方式。 如需詳細資訊,請參閱 Azure Functions HTTP 觸發程式 - 授權金鑰。 如果呼叫 API 因為任何原因而失敗,程式代碼會傳回錯誤訊息和狀態代碼。
假設 API 呼叫成功並傳回數值,應用程式接著會使用該數位加上一些隨機字元來建構更複雜的程式碼(使用自己的 random_char 函式)。
data = r.json()
chars1 = random_char(3)
chars2 = random_char(3)
code_value = f"{chars1}-{data['value']}-{chars2}"
code = { "code": code_value, "timestamp" : str(datetime.utcnow()) }
這裡的 code 變數包含應用程式 API 的完整 JSON 回應,其中包含程式代碼值和時間戳。 範例回應可能是 {"code":"ojE-161-pTv","timestamp":"2020-04-15 16:54:48.816549"}。
不過,在傳回該回應之前,它會使用佇列用戶端的 send_message 方法,在記憶體佇列中寫入訊息:
queue_client.send_message(code)
return jsonify(code)
處理佇列訊息
您可以透過 Azure 入口,使用 Azure CLI 命令 az storage message get 或 Azure 儲存體瀏覽器檢視及管理儲存在佇列中的訊息。 範例存放庫包含文稿 (test.cmd 和 test.sh),可從應用程式端點要求程式代碼,然後檢查消息佇列。 另外還有一個腳本,可使用 az storage message clear 命令清除佇列。
一般而言,像此範例中的應用程式會有另一個進程,以異步方式從佇列提取訊息以進行進一步處理。 如先前所述,此 API 端點所產生的回應可能會用於應用程式中具有雙因素使用者驗證的其他地方。 在此情況下,應用程式應該在一段時間后使程式代碼失效,例如10分鐘。 執行這項工作的簡單方式是維護其使用者登入程式所使用的有效雙因素驗證代碼數據表。 然後,應用程式會有一個簡單的佇列監看程式,其中包含下列邏輯(在虛擬程式碼中):
pull a message from the queue and retrieve the code.
if (code is already in the table):
remove the code from the table, thereby invalidating it
else:
add the code to the table, making it valid
call queue_client.send_message(code, visibility_timeout=600)
這個虛擬程式代碼會採用 send_message 方法的選擇性 visibility_timeout 參數,指定訊息在佇列中可見之前的秒數。 由於預設逾時為零,因此 API 端點最初寫入的訊息會立即顯示在佇列監看程式上。 因此,該程式會立即將它們儲存在有效的程式碼數據表中。 程序會將相同的訊息連同逾時時間再次排入佇列,以便於 10 分鐘後再次收到該代碼,屆時會從數據表中移除該訊息。
在 Azure Functions 中實作主要應用程式 API 端點
本文先前顯示的程式代碼會使用 Flask Web 架構來建立其 API 端點。 由於 Flask 需要使用 Web 伺服器執行,因此這類程式代碼必須部署至 Azure App 服務 或虛擬機。
替代部署選項是 Azure Functions 的無伺服器環境。 在此情況下,所有啟動程式代碼和 API 端點程式代碼都會包含在系結至 HTTP 觸發程式的相同函式內。 如同 App Service,您可以使用 函式應用程式設定 來建立程式代碼的環境變數。
其中一個更容易實作的部分是使用佇列儲存體進行驗證。 您不需要使用佇列的 URL 和認證物件來取得 QueueClient 物件,而是為函式建立 佇列記憶體系結。 綁定會處理幕後的所有驗證。 透過這類系結,您的函式會提供現成可用的客戶端物件做為參數。 如需詳細資訊和範例程式代碼,請參閱 將 Azure Functions 連線至 Azure 佇列記憶體。
後續步驟
透過本教學課程,您已瞭解如何使用受控識別向其他 Azure 服務驗證應用程式,以及應用程式如何使用 Azure Key Vault 來儲存第三方 API 的任何其他必要秘密。
此處示範的相同模式與 Azure Key Vault 和 Azure 記憶體會套用至所有其他 Azure 服務。 關鍵步驟是您在 Azure 入口網站或透過 Azure CLI,為該服務頁面上的應用程式指派正確的角色。 請參閱「如何指派Azure 角色」。 請務必檢查服務檔,以查看您是否需要設定任何其他存取原則。
請務必記住,您必須將相同的角色和存取原則指派給您用於本機開發的任何服務主體。
簡言之,完成本逐步解說后,您可以將知識套用至任意數目的其他 Azure 服務和任意數目的其他外部服務。
本教學未涵蓋的一個主題是 使用者認證。 若要探索 Web 應用程式的這個區域,請從 驗證和授權 Azure App 服務 中的使用者端對端開始。
另請參閱
- 如何在 Azure 上驗證和授權 Python 應用程式
- 逐步解說範例:github.com/Azure-Samples/python-integrated-authentication
- Microsoft Entra 文件
- Azure Key Vault 文件