Část 7: Hlavní koncový bod rozhraní API aplikace

Předchozí část: Hlavní spouštěcí kód aplikace

Cesta URL aplikace /api/v1/getcode pro rozhraní API vygeneruje odpověď JSON obsahující alfanumerický kód a časové razítko.

Nejprve dekorátor @app.route říká Flasku, že funkce get_code zpracovává požadavky na adresu URL /api/v1/getcode.

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

Dále aplikace volá API třetí strany, jehož URL je v number_url, a poskytuje přístupový klíč, který v hlavičce načte z trezoru klíčů.

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

Příklad rozhraní API třetí strany se nasadí do bezserverového prostředí služby Azure Functions. Vlastnost x-functions-key v hlavičce určuje, jak služba Azure Functions očekává, že se v hlavičce zobrazí přístupový klíč. Další informace najdete v tématu trigger HTTP služby Azure Functions – autorizační klíče. Pokud volání rozhraní API z nějakého důvodu selže, vrátí kód chybovou zprávu a stavový kód.

Za předpokladu, že volání rozhraní API proběhne úspěšně a vrátí číselnou hodnotu, aplikace pak pomocí takového čísla vytvoří složitější kód a několik náhodných znaků (pomocí vlastní funkce 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()) }

Proměnná code obsahuje úplnou odpověď JSON pro rozhraní API aplikace, která obsahuje hodnotu kódu a časové razítko. Příklad odpovědi by byl {"code":"ojE-161-pTv","timestamp":"2020-04-15 16:54:48.816549"}.

Než však vrátí tuto odpověď, zapíše zprávu do fronty úložiště pomocí metody send_message klienta Queue:

queue_client.send_message(code)

return jsonify(code)

Zpracování zpráv fronty

Zprávy uložené ve frontě je možné zobrazit a spravovat prostřednictvím webu Azure Portal pomocí příkazu az storage message get Azure CLI nebo Pomocí Průzkumníka služby Azure Storage. Ukázkové úložiště obsahuje skript (test.cmd a test.sh), který požádá o kód z koncového bodu aplikace a pak zkontroluje frontu zpráv. Pomocí příkazu az storage message clear je také skript pro vymazání fronty.

Aplikace jako v tomto příkladu by obvykle měla jiný proces, který asynchronně načítá zprávy z fronty pro další zpracování. Jak už jsme zmínili dříve, odpověď vygenerovaná tímto koncovým bodem rozhraní API se může používat jinde v aplikaci s dvojúrovňovým ověřováním uživatelů. V takovém případě by aplikace měla kód po určité době zneplatnit, například 10 minut. Jednoduchým způsobem, jak tuto úlohu provést, je udržovat tabulku platných dvoufaktorových ověřovacích kódů, které používají přihlašovací procedura uživatele. Aplikace by pak měla jednoduchý proces sledování front s následující logikou (v pseudokódu):

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)

Tento pseudokód využívá volitelný send_message parametr metody visibility_timeout, který určuje počet sekund před zobrazením zprávy ve frontě. Vzhledem k tomu, že výchozí časový limit je nulový, začnou se zprávy napsané koncovým bodem rozhraní API okamžitě zobrazovat procesu sledování fronty. V důsledku toho je tento proces okamžitě uloží do platné tabulky kódu. Proces znovu zařadí stejnou zprávu do fronty s časovým limitem, aby kód obdržela znovu za 10 minut, a pak ji odebere z tabulky.

Implementace hlavního koncového bodu rozhraní API aplikace ve službě Azure Functions

Kód uvedený dříve v tomto článku používá k vytvoření koncového bodu rozhraní API webovou architekturu Flask. Vzhledem k tomu, že Flask musí běžet s webovým serverem, musí být takový kód nasazený do služby Azure App Service nebo do virtuálního počítače.

Alternativní možností nasazení je bezserverové prostředí Azure Functions. V tomto případě by byl veškerý spouštěcí kód a kód koncového bodu rozhraní API obsaženy ve stejné funkci, která je svázaná s triggerem HTTP. Stejně jako u App Service použijete nastavení funkcí aplikace , abyste vytvořili proměnné prostředí pro váš kód.

Jednou částí implementace, která se stává jednodušší, je autentizace ve službě Queue Storage. Místo získání objektu QueueClient pomocí adresy URL fronty a objektu přihlašovacích údajů vytvoříte pro funkci vazbu úložiště fronty . Vazba zpracovává veškeré ověřování na pozadí. U takové vazby má vaše funkce jako parametr připravený klientský objekt. Další informace a ukázkový kód najdete v tématu Připojení Azure Functions ke službě Azure Queue Storage.

Další kroky

V tomto kurzu jste zjistili, jak se aplikace ověřují s jinými službami Azure pomocí spravované identity a jak můžou aplikace používat Azure Key Vault k ukládání dalších nezbytných tajných kódů pro rozhraní API třetích stran.

Stejný vzor, který jsme si ukázali u služby Azure Key Vault a Azure Storage, platí pro všechny ostatní služby Azure. Zásadním krokem je přiřazení správné role pro aplikaci na stránce dané služby na webu Azure Portal nebo prostřednictvím Azure CLI. (Viz Přiřazení rolí Azure). Nezapomeňte si prohlédnout dokumentaci ke službě a zjistit, jestli potřebujete nakonfigurovat jiné zásady přístupu.

Pamatujte, že potřebujete přiřadit stejné role a přístupové zásady k jakémukoli 'service principal', který používáte pro místní vývoj.

Stručně řečeno, po dokončení tohoto názorného postupu můžete své znalosti použít na libovolný počet dalších služeb Azure a libovolný počet dalších externích služeb.

Jedním předmětem, na který se tento kurz nevztahuje, je ověřování uživatelů. Pokud chcete prozkoumat tuto oblast webových aplikací, začněte Komplexním ověřováním a autorizací uživatelů ve službě Azure App Service.

Viz také