Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
parte precedente: codice di avvio dell'app principale
Il percorso dell'URL dell'app /api/v1/getcode per l'API genera una risposta JSON che contiene un codice alfanumerico e un timestamp.
Prima di tutto, il decorator @app.route indica a Flask che la funzione get_code gestisce le richieste all'URL /api/v1/getcode.
@app.route('/api/v1/getcode', methods=['GET'])
def get_code():
L'app chiama quindi l'API di terze parti, il cui URL si trova in number_url, fornendo la chiave di accesso che recupera dall'archivio delle chiavi nell'intestazione.
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
L'API di terze parti di esempio viene distribuita nell'ambiente serverless di Funzioni di Azure. La proprietà x-functions-key nell'intestazione è il modo in cui Funzioni di Azure prevede la visualizzazione di una chiave di accesso in un'intestazione. Per ulteriori informazioni, vedere Funzioni di Azure HTTP trigger, Chiavi di autorizzazione. Se la chiamata all'API non riesce per qualsiasi motivo, il codice restituisce un messaggio di errore e il codice di stato.
Supponendo che la chiamata API abbia esito positivo e restituisca un valore numerico, l'app crea quindi un codice più complesso usando tale numero più alcuni caratteri casuali (usando la propria funzione 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 variabile code contiene la risposta JSON completa per l'API dell'app, che include il valore del codice e un timestamp. Una risposta di esempio è {"code":"ojE-161-pTv","timestamp":"2020-04-15 16:54:48.816549"}.
Prima di restituire tale risposta, tuttavia, scrive un messaggio nella coda di archiviazione usando il metodo send_message del client Queue:
queue_client.send_message(code)
return jsonify(code)
Elaborazione dei messaggi della coda
I messaggi archiviati nella coda possono essere visualizzati e gestiti tramite il portale di Azure, con il comando dell'interfaccia della riga di comando az storage message get di Azure o con Azure Storage Explorer. Il repository di esempio include uno script (test.cmd e test.sh) per richiedere un codice dall'endpoint dell'app e quindi controllare la coda dei messaggi. Esiste anche uno script per cancellare la coda usando il comando az storage message clear.
In genere, un'app come quella di questo esempio avrebbe un altro processo che estrae asincronicamente i messaggi dalla coda per un'ulteriore elaborazione. Come accennato in precedenza, la risposta generata da questo endpoint API potrebbe essere usata altrove nell'app con l'autenticazione utente a due fattori. In tal caso, l'app deve invalidare il codice dopo un determinato periodo di tempo, ad esempio 10 minuti. Un modo semplice per eseguire questa attività consiste nel gestire una tabella di codici di autenticazione a due fattori validi, usati dalla procedura di accesso dell'utente. L'app avrà quindi un semplice processo di controllo delle code con la logica seguente (in pseudo-codice):
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)
Questo pseudocodice usa il parametro facoltativo send_message del metodo visibility_timeout, che specifica il numero di secondi prima che il messaggio diventi visibile nella coda. Poiché il timeout predefinito è zero, i messaggi scritti inizialmente dall'endpoint API diventano immediatamente visibili al processo di controllo della coda. Di conseguenza, questo processo li archivia immediatamente nella tabella di codice valida. Il processo accoda nuovamente lo stesso messaggio con il timeout, in modo che riceva nuovamente il codice 10 minuti dopo, e poi lo rimuove dalla tabella.
Implementazione dell'endpoint API dell'app principale in Funzioni di Azure
Il codice illustrato in precedenza in questo articolo usa il framework Web Flask per creare l'endpoint API. Poiché Flask deve essere eseguito con un server Web, tale codice deve essere distribuito nel servizio app di Azure o in una macchina virtuale.
Un'opzione di distribuzione alternativa è l'ambiente serverless di Funzioni di Azure. In questo caso, tutto il codice di avvio e il codice dell'endpoint API sarebbero contenuti all'interno della stessa funzione associata a un trigger HTTP. Come nel Servizio app, si utilizzano le impostazioni dell'applicazione funzionali per creare variabili di ambiente per il codice.
Una parte dell'implementazione che diventa più semplice è l'autenticazione con Queue Storage. Invece di ottenere un oggetto QueueClient usando l'URL della coda e un oggetto credenziale, si crea un 'associazione di archiviazione code per la funzione. Il binding gestisce tutte le autenticazioni dietro le quinte. Con un'associazione di questo tipo, alla funzione viene assegnato un oggetto client pronto per l'uso come parametro. Per altre informazioni e codice di esempio, vedere Connettere le Funzioni di Azure ad Archiviazione di code Azure.
Passaggi successivi
In questa esercitazione si è appreso come le app eseguono l'autenticazione con altri servizi di Azure usando l'identità gestita e come le app possono usare Azure Key Vault per archiviare tutti gli altri segreti necessari per le API di terze parti.
Lo stesso modello illustrato qui con Azure Key Vault e Archiviazione di Azure si applica a tutti gli altri servizi di Azure. Il passaggio cruciale consiste nell'assegnare il ruolo corretto per l'app all'interno della pagina del servizio nel portale di Azure o tramite l'interfaccia della riga di comando di Azure. Vedere Come assegnare ruoli di Azure). Assicurarsi di controllare la documentazione del servizio per verificare se è necessario configurare altri criteri di accesso.
Tenere sempre presente che è necessario assegnare gli stessi ruoli e politiche di accesso a qualsiasi principale del servizio in uso per lo sviluppo locale.
In breve, dopo aver completato questa procedura dettagliata, è possibile applicare le proprie conoscenze a un numero qualsiasi di altri servizi di Azure e a un numero qualsiasi di altri servizi esterni.
Un argomento che non è stato toccato in questa esercitazione è l'autenticazione degli utenti . Per esplorare questa area per le app Web, iniziare con Autenticare e autorizzare gli utenti end-to-end nel servizio app di Azure.