Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Parte anterior: Implementación de API de terceros
La aplicación principal de nuestro escenario es una aplicación de Flask sencilla que se implementa en Azure App Service. La aplicación proporciona un punto de conexión de API público denominado /api/v1/getcode, que genera un código para algún otro propósito en la aplicación (por ejemplo, con autenticación en dos fases para usuarios humanos). La aplicación principal también proporciona una página principal sencilla que muestra un vínculo al punto de conexión de API.
El script de aprovisionamiento del ejemplo realiza los pasos siguientes:
Cree el host de App Service e implemente el código con el comando de la CLI de Azure,
az webapp up.Cree una cuenta de Azure Storage para la aplicación principal (mediante
az storage account create).Cree una cola en la cuenta de almacenamiento denominada "code-requests" (mediante
az storage queue create).Para asegurarse de que la aplicación puede escribir en la cola, use
az role assignment createpara asignar el rol "Colaborador de datos de la cola de Storage" a la aplicación. Para más información sobre los roles, consulte Asignación de permisos de rol mediante la CLI de Azure.
El código de aplicación principal es el siguiente; Se proporcionan explicaciones de detalles importantes en las siguientes partes de esta serie.
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()