Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Előző rész: Külső API-implementáció
Ebben a forgatókönyvben a fő alkalmazás egy egyszerű Flask-alkalmazás, amelyet üzembe helyez a Azure App Service. Az alkalmazás egy /api/v1/getcode nevű nyilvános API-végpontot biztosít, amely létrehoz egy kódot valamilyen más célra az alkalmazásban (például kéttényezős hitelesítéssel az emberi felhasználók számára). A fő alkalmazás egy egyszerű kezdőlapot is biztosít, amely megjeleníti az API-végpontra mutató hivatkozást.
A minta kiépítési szkriptje a következő lépéseket hajtja végre:
Hozza létre az App Service-gazdagépet, és telepítse a kódot a Azure CLI paranccsal
az webapp up.Hozzon létre egy Azure Storage fiókot a fő alkalmazáshoz a használatával
az storage account create.Hozzon létre egy „code-requests” nevű várólistát a tárfiókban a(z)
az storage queue createhasználatával.Annak érdekében, hogy az alkalmazás írni tudjon az üzenetsorba, a
az role assignment createhasználatával rendelje hozzá az alkalmazáshoz a Storage Queue Data Contributor szerepkört. A szerepkörökkel kapcsolatos további információkért lásd: Szerepkör-engedélyek hozzárendelése az Azure CLI használatával.
A fő alkalmazáskód a következő. A fontos részletek magyarázata a sorozat következő részeiben található.
from flask import Flask, request, jsonify
import requests, random, string, os
from datetime import datetime
from azure.keyvault.secrets import SecretClient
from azure.identity import DefaultAzureCredential
from azure.storage.queue import QueueClient
app = Flask(__name__)
app.config["DEBUG"] = True
number_url = os.environ["THIRD_PARTY_API_ENDPOINT"]
# Authenticate with Azure. First, obtain the DefaultAzureCredential
credential = DefaultAzureCredential()
# Next, get the client for the Key Vault. You must have first enabled managed identity
# on the App Service for the credential to authenticate with Key Vault.
key_vault_url = os.environ["KEY_VAULT_URL"]
keyvault_client = SecretClient(vault_url=key_vault_url, credential=credential)
# Obtain the secret: for this step to work you must add the app's service principal to
# the key vault's access policies for secret management.
api_secret_name = os.environ["THIRD_PARTY_API_SECRET_NAME"]
vault_secret = keyvault_client.get_secret(api_secret_name)
# The "secret" from Key Vault is an object with multiple properties. The key we
# want for the third-party API is in the value property.
access_key = vault_secret.value
# Set up the Storage queue client to which we write messages
queue_url = os.environ["STORAGE_QUEUE_URL"]
queue_client = QueueClient.from_queue_url(queue_url=queue_url, credential=credential)
@app.route('/', methods=['GET'])
def home():
return f'Home page of the main app. Make a request to <a href="./api/v1/getcode">/api/v1/getcode</a>.'
def random_char(num):
return ''.join(random.choice(string.ascii_letters) for x in range(num))
@app.route('/api/v1/getcode', methods=['GET'])
def get_code():
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
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()) }
# Log a queue message with the code for, say, a process that invalidates
# the code after a certain period of time.
queue_client.send_message(code)
return jsonify(code)
if __name__ == '__main__':
app.run()