Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Parte anterior: Código de inicialização do aplicativo principal
O caminho de URL da aplicação /api/v1/getcode para a API gera uma resposta JSON que contém um código alfanumérico e um carimbo de data/hora.
Primeiro, o decorador @app.route
informa ao Flask que a função get_code
lida com as solicitações para o URL /api/v1/getcode.
@app.route('/api/v1/getcode', methods=['GET'])
def get_code():
Em seguida, a aplicação chama a API de terceiros, cuja URL está em number_url
, fornecendo a chave de acesso que é recuperada do cofre de chaves no cabeçalho.
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
O exemplo de API de terceiros é implantado 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, consulte gatilho HTTP do Azure Functions - Chaves de autorização. Se a chamada da API falhar por qualquer motivo, o código retornará uma mensagem de erro e o código de status.
Supondo que a chamada de API seja bem-sucedida e retorne um valor numérico, o aplicativo constrói 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. Um exemplo de resposta seria {"code":"ojE-161-pTv","timestamp":"2020-04-15 16:54:48.816549"}
.
Antes de retornar essa resposta, no entanto, ele grava uma mensagem na fila de armazenamento usando o método send_message
do cliente de fila:
queue_client.send_message(code)
return jsonify(code)
Processando mensagens da fila
As mensagens armazenadas na fila podem ser visualizadas e geridas através do portal do Azure, com o comando az storage message get
Azure CLI ou com o Azure Storage Explorer. 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. Há também um script para limpar a fila usando o comando az storage message clear
.
Normalmente, um aplicativo como o deste exemplo teria outro processo que extrai mensagens da fila de forma assíncrona para processamento posterior. Como mencionado anteriormente, a resposta gerada por este endpoint da API pode ser usada noutro lugar da aplicação com autenticação de utilizador 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. O aplicativo teria então um processo simples de observação de filas 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 se torne visível na fila. Como o intervalo de tempo padrão é zero, as mensagens inicialmente gravadas pelo ponto de extremidade da API tornam-se imediatamente visíveis para o processo de monitorização da fila. Como resultado, esse processo os armazena na tabela de códigos válida imediatamente. O processo enfileira a mesma mensagem novamente com um tempo limite, de forma que o código seja recebido novamente 10 minutos depois, altura em que é removido da tabela.
Implementando o endpoint da API da aplicação principal no Azure Functions
O código mostrado anteriormente neste artigo usa o framework web Flask para criar o 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 de ponto de extremidade da API estariam contidos na mesma função vinculada a um gatilho HTTP. Assim como acontece com o Serviço de Aplicativo, você usa função configurações de aplicativo para criar variáveis de ambiente para seu código.
Uma parte da implementação que se torna mais fácil é a autenticação com o Queue Storage. Em vez de obter um objeto QueueClient
utilizando o URL da fila e um objeto de credencial, cria-se uma vinculação de armazenamento de fila para a função. O vínculo lida com toda a autenticação em segundo plano. Com essa ligação, sua função recebe um objeto cliente pronto para uso como parâmetro. Para obter mais informações e código de exemplo, consulte Conectar funções do Azure aoArmazenamento de Filas do Azure.
Próximos passos
Através 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 Cofre da Chave do Azure 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 aplica-se a todos os outros serviços do Azure. A etapa crucial é atribuir 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). Certifique-se de verificar a documentação de serviço para ver se você precisa configurar outras políticas de acesso.
Lembra-te sempre de que deves atribuir as mesmas funções e políticas de acesso a qualquer entidade de serviço que estejas a usar para desenvolvimento local.
Em resumo, depois de 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 esta área para aplicações web, comece com Autenticar e autorizar utilizadores de ponta a ponta no Serviço de Aplicações do Azure.