Compartir a través de


Parte 7: Punto de conexión principal de la API de la aplicación

parte anterior: código de inicio de la aplicación principal

La ruta URL de la aplicación /api/v1/getcode en la API genera una respuesta JSON que contiene un código alfanumérico y un sello de tiempo.

En primer lugar, el decorador @app.route indica a Flask que la función get_code gestiona las solicitudes a la URL /api/v1/getcode.

@app.route('/api/v1/getcode', methods=['GET'])
def get_code():

A continuación, la aplicación llama a la API de terceros, cuya URL está en number_url, proporcionando en la cabecera la clave de acceso que recupera del almacén de claves.

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

La API de terceros de ejemplo se implementa en el entorno sin servidor de Azure Functions. La propiedad x-functions-key del encabezado es cómo Azure Functions espera que aparezca una clave de acceso en un encabezado. Para más información, consulte desencadenador HTTP de Azure Functions: claves de autorización. Si se produce un error en la llamada a la API por cualquier motivo, el código devuelve un mensaje de error y el código de estado.

Suponiendo que la llamada API se realiza correctamente y devuelve un valor numérico, la aplicación crea un código más complejo con ese número más algunos caracteres aleatorios (mediante su propia función de 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()) }

La variable code aquí contiene la respuesta JSON completa para la API de la aplicación, que incluye el valor de código y una marca de tiempo. Una respuesta de ejemplo sería {"code":"ojE-161-pTv","timestamp":"2020-04-15 16:54:48.816549"}.

Sin embargo, antes de devolver esa respuesta, escribe un mensaje en la cola de almacenamiento mediante el método send_message del cliente de cola:

queue_client.send_message(code)

return jsonify(code)

Procesamiento de mensajes de cola

Los mensajes almacenados en la cola se pueden ver y administrar mediante Azure Portal, con el comando az storage message get de la CLI de Azure o con el Explorador de Azure Storage. El repositorio de ejemplo incluye un script (test.cmd y test.sh) para solicitar un código desde el punto de conexión de la aplicación y, a continuación, comprobar la cola de mensajes. También hay un script para borrar la cola mediante el comando az storage message clear.

Normalmente, una aplicación como la de este ejemplo tendría otro proceso que extrae de forma asincrónica los mensajes de la cola para su posterior procesamiento. Como se mencionó anteriormente, la respuesta generada por este punto de conexión de API podría usarse en otra parte de la aplicación con autenticación de usuario en dos fases. En ese caso, la aplicación debe invalidar el código después de un período de tiempo determinado, por ejemplo, 10 minutos. Una manera sencilla de realizar esta tarea sería mantener una tabla de códigos de autenticación en dos fases válidos, que usa su procedimiento de inicio de sesión de usuario. A continuación, la aplicación tendría un proceso sencillo de inspección de colas con la siguiente lógica (en pseudocódigo):

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)

Este pseudocódigo emplea el parámetro opcional send_message del método visibility_timeout, que especifica el número de segundos antes de que el mensaje se vea en la cola. Dado que el tiempo de espera predeterminado es cero, los mensajes escritos inicialmente por el endpoint de API se vuelven inmediatamente visibles para el proceso de monitoreo de cola. Como resultado, ese proceso los almacena en la tabla de código válida inmediatamente. El proceso pone en cola el mismo mensaje nuevamente con el límite de tiempo de espera, para que vuelva a recibir el código 10 minutos más tarde, momento en el cual elimina el mensaje de la tabla.

Implementación del punto de conexión de API de la aplicación principal en Azure Functions

El código que se muestra anteriormente en este artículo usa el marco web de Flask para crear su punto de conexión de API. Dado que Flask debe ejecutarse con un servidor web, este código debe implementarse en Azure App Service o en una máquina virtual.

Una opción de implementación alternativa es el entorno sin servidor de Azure Functions. En este caso, todo el código de inicio y el código de punto de conexión de API se incluirán en la misma función enlazada a un desencadenador HTTP. Al igual que con App Service, se usa la configuración de la aplicación de funciones para crear las variables de entorno para el código.

Una parte de la implementación que se vuelve más fácil es autenticarse con Queue Storage. En lugar de obtener un objeto QueueClient mediante la dirección URL de la cola y un objeto de credencial, se crea un enlace de Queue Storage para la función. El enlace controla toda la autenticación en segundo plano. Con este tipo de enlace, a la función se le asigna un objeto de cliente listo para usar como parámetro. Para obtener más información y ejemplos de código, consulte Funciones de Azure conectadas a Azure Queue Storage.

Pasos siguientes

A través de este tutorial, ha aprendido cómo las aplicaciones se autentican con otros servicios de Azure mediante identidad administrada y cómo las aplicaciones pueden usar Azure Key Vault para almacenar cualquier otro secreto necesario para las API de terceros.

El mismo patrón que se muestra aquí con Azure Key Vault y Azure Storage se aplica a todos los demás servicios de Azure. El paso fundamental es asignar el rol correcto para la aplicación dentro de la página de ese servicio en Azure Portal o a través de la CLI de Azure. (Consulte Cómo asignar roles de Azure). Asegúrese de comprobar la documentación del servicio para ver si necesita configurar otras directivas de acceso.

Recuerde siempre que debe asignar los mismos roles y directivas de acceso a cualquier entidad de servicio que use para el desarrollo local.

En resumen, una vez completado este tutorial, puede aplicar sus conocimientos a cualquier número de otros servicios de Azure y a cualquier número de otros servicios externos.

Un tema que no hemos tocado en este tutorial es la autenticación de usuarios . Para explorar esta área para aplicaciones web, empiece con Autenticar y autorizar a los usuarios de extremo a extremo en Azure App Service.

Consulte también