Compartilhar via


Parte 7: Ponto de extremidade da API do aplicativo principal

Parte anterior: código de inicialização do aplicativo principal

O caminho da URL do aplicativo /api/v1/getcode para a API gera uma resposta JSON que contém um código alfanumérico e um timestamp.

Primeiro, o decorador de @app.route informa ao Flask que a função get_code manipula solicitações para a URL /api/v1/getcode.

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

Depois, o aplicativo chama a API de terceiros, cuja URL está em number_url, fornecendo, no cabeçalho, a chave de acesso que ele recupera do cofre de chaves.

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

A API de terceiros de exemplo é implantada no ambiente sem servidor do Azure Functions. A propriedade x-functions-key no cabeçalho é como o Azure Functions espera que uma chave de acesso apareça em um cabeçalho. Para obter mais informações, confira Gatilho HTTP do Azure Functions – Chaves de autorização. Se a chamada à API falhar por qualquer motivo, o código retornará uma mensagem de erro e o código de status.

Supondo que a chamada à API seja bem-sucedida e retorne um valor numérico, o aplicativo construirá um código mais complexo usando esse número mais alguns caracteres aleatórios (usando sua própria função 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()) }

A variável code aqui contém a resposta JSON completa para a API do aplicativo, que inclui o valor do código e um carimbo de data/hora. Uma resposta de exemplo seria {"code":"ojE-161-pTv","timestamp":"2020-04-15 16:54:48.816549"}.

No entanto, antes de retornar essa resposta, ele grava uma mensagem na fila de armazenamento usando o método send_message do cliente da fila:

queue_client.send_message(code)

return jsonify(code)

Processando mensagens da fila

As mensagens armazenadas na fila podem ser exibidas e gerenciadas por meio do portal do Azure, com o comando az storage message get da CLI do Azure ou com o Gerenciador de Armazenamento do Azure. O repositório de exemplo inclui um script (test.cmd e test.sh) para solicitar um código do ponto de extremidade do aplicativo e, em seguida, verificar a fila de mensagens. Também há um script para limpar a fila usando o comando az storage message clear.

Normalmente, um aplicativo como o deste exemplo teria outro processo que retira mensagens de forma assíncrona da fila para processamento posterior. Conforme mencionado anteriormente, a resposta gerada por este endpoint de API pode ser usada em outras partes do aplicativo com autenticação de usuário de dois fatores. Nesse caso, o aplicativo deve invalidar o código após um determinado período de tempo, por exemplo, 10 minutos. Uma maneira simples de fazer essa tarefa seria manter uma tabela de códigos de autenticação de dois fatores válidos, que são usados pelo procedimento de entrada do usuário. Em seguida, o aplicativo teria um processo simples de observação de fila com a seguinte lógica (em 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)

Esse pseudocódigo emprega o parâmetro send_message opcional do método visibility_timeout, que especifica o número de segundos antes que a mensagem fique visível na fila. Como o tempo limite padrão é zero, as mensagens inicialmente gravadas pelo ponto de extremidade de API tornam-se imediatamente visíveis para o processo de observação da fila. Como resultado, esse processo os armazena na tabela de código válida imediatamente. O processo enfileira novamente a mesma mensagem com o tempo limite, para que o código seja recebido novamente 10 minutos depois, momento em que é removido da tabela.

Implementando o endpoint de API do aplicativo principal no Azure Functions

O código mostrado anteriormente neste artigo usa o framework web Flask para criar seu endpoint de API. Como o Flask precisa ser executado com um servidor Web, esse código deve ser implantado no Serviço de Aplicativo do Azure ou em uma máquina virtual.

Uma opção de implantação alternativa é o ambiente sem servidor do Azure Functions. Nesse caso, todo o código de inicialização e o código do ponto de extremidade da API estariam contidos na mesma função associada a um gatilho HTTP. Assim como acontece com o Serviço de Aplicativo, você usa as configurações do aplicativo de funções para criar variáveis de ambiente para o seu código.

Uma parte da implementação que fica mais fácil é a autenticação com o Armazenamento de Filas. Em vez de obter um objeto QueueClient usando a URL da fila e um objeto de credencial, você cria uma associação de armazenamento de filas para a função. A associação manipula toda a autenticação em segundo plano. Com essa associação, sua função recebe um objeto cliente pronto para uso como um parâmetro. Para obter mais informações e código de exemplo, consulte Conectar o Azure Functions ao Armazenamento de Filas do Azure.

Próximas etapas

Por meio deste tutorial, você aprendeu como os aplicativos se autenticam com outros serviços do Azure usando a identidade gerenciada e como os aplicativos podem usar o Azure Key Vault para armazenar quaisquer outros segredos necessários para APIs de terceiros.

O mesmo padrão demonstrado aqui com o Azure Key Vault e o Armazenamento do Azure se aplica a todos os outros serviços do Azure. A etapa crucial é que você atribua a função correta para o aplicativo na página desse serviço no portal do Azure ou por meio da CLI do Azure. (Consulte Como atribuir funções do Azure). Verifique a documentação do serviço para ver se você precisa configurar outras políticas de acesso.

Lembre-se sempre de que você precisa atribuir as mesmas funções e políticas de acesso a qualquer principal de serviço que estiver usando para desenvolvimento local.

Em suma, após concluir este passo a passo, você pode aplicar seu conhecimento a qualquer número de outros serviços do Azure e a qualquer número de outros serviços externos.

Um assunto que não abordamos neste tutorial é a autenticação de usuários . Para explorar essa área para aplicativos Web, comece com Autenticar e autorizar usuários de ponta a ponta no Serviço de Aplicativo do Azure.

Consulte também