Часть 7. Основная конечная точка API приложения

предыдущая часть: основной код запуска приложения

Путь URL-адреса приложения /api/v1/getcode для API создает ответ JSON, содержащий буквенно-цифровой код и метку времени.

Во-первых, декоратор @app.route сообщает Flask, что функция get_code обрабатывает запросы к URL-адресу /api/v1/getcode.

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

Затем приложение вызывает сторонний API, URL-адрес которого находится в number_url, предоставляя ключ доступа, полученный из хранилища ключей в заголовке.

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

Пример стороннего API развертывается в бессерверной среде Функций Azure. Свойство x-functions-key в заголовке указывает на то, как именно должен отображаться ключ доступа в заголовке в соответствии с ожиданиями функций Azure. Дополнительные сведения см. в статье триггер HTTP функций Azure — ключи авторизации. Если вызов API завершается ошибкой по какой-либо причине, код возвращает сообщение об ошибке и код состояния.

Если вызов API успешно выполнен и возвращает числовое значение, приложение создает более сложный код, используя это число, а также некоторые случайные символы (используя собственную функцию 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()) }

Переменная code здесь содержит полный ответ JSON для API приложения, который включает значение кода и метку времени. Пример ответа будет {"code":"ojE-161-pTv","timestamp":"2020-04-15 16:54:48.816549"}.

Прежде чем он возвращает этот ответ, он записывает сообщение в очередь хранилища с помощью метода send_message клиента очереди:

queue_client.send_message(code)

return jsonify(code)

Обработка сообщений очереди

Сообщения, хранящиеся в очереди, можно просматривать и управлять с помощью портала Azure с помощью команды az storage message get Azure CLI или обозревателя службы хранилища Azure. Пример репозитория включает скрипт (test.cmd и test.sh), чтобы запросить код из конечной точки приложения, а затем проверить очередь сообщений. Существует также скрипт для очистки очереди с помощью команды az storage message clear.

Как правило, приложение, например одно из этих примеров, будет иметь другой процесс, который асинхронно извлекает сообщения из очереди для дальнейшей обработки. Как упоминалось ранее, ответ, созданный этой конечной точкой API, может использоваться в другом месте приложения с двухфакторной проверкой подлинности пользователя. В этом случае приложение должно отменять код через определенный период времени, например 10 минут. Простой способ сделать эту задачу — сохранить таблицу допустимых двухфакторных кодов проверки подлинности, которые используются процедурой входа пользователя. Затем приложение будет иметь простой процесс наблюдения за очередью со следующей логикой (в псевдокоде):

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)

Этот псевдокод использует необязательный параметр send_message метода visibility_timeout, который указывает количество секунд, прежде чем сообщение становится видимым в очереди. Так как время ожидания по умолчанию равно нулю, сообщения, первоначально написанные конечной точкой API, сразу же видны процессу просмотра очередей. В результате этот процесс сохраняет их в допустимой таблице кода сразу. Процесс снова помещает в очередь то же сообщение с временем ожидания, чтобы через 10 минут он снова получил код, затем удаляет его из таблицы.

Реализация основной конечной точки API приложения в Функциях Azure

Приведенный ранее код использует веб-платформу Flask для создания конечной точки API. Так как Flask необходимо запустить с веб-сервером, такой код должен быть развернут в Службе приложений Azure или на виртуальной машине.

Альтернативным вариантом развертывания является бессерверная среда функций Azure. В этом случае весь код запуска и код конечной точки API будут содержаться в одной функции, привязанной к триггеру HTTP. Как и в App Service, вы используете параметры функции приложения для создания переменных среды для вашего кода.

Одна из частей реализации, которая становится проще, заключается в аутентификации с Queue Storage. Вместо получения объекта QueueClient с помощью URL-адреса очереди и объекта учетных данных создается привязка хранилища очередей для функции. Привязка выполняет всю проверку подлинности за кулисами. С такой привязкой функция получает готовый к использованию клиентский объект в качестве параметра. Дополнительные сведения и пример кода см. в статье Подключение функций Azure к хранилищу очередей Azure.

Дальнейшие действия

В этом руководстве вы узнали, как приложения проходят проверку подлинности с помощью других служб Azure с помощью управляемого удостоверения и как приложения могут использовать Azure Key Vault для хранения других необходимых секретов для сторонних API.

Тот же шаблон, показанный здесь с Azure Key Vault и службой хранилища Azure, применяется ко всем другим службам Azure. Важным шагом является назначение правильной роли приложения на странице этой службы на портале Azure или с помощью Azure CLI. (См. , как назначить ролив Azure). Обязательно проверьте документацию по службе, чтобы узнать, нужно ли настроить другие политики доступа.

Всегда помните, что необходимо назначить те же роли и политики доступа любому субъекту-службе, который вы используете для локальной разработки.

Короче говоря, выполнив это пошаговое руководство, вы можете применить свои знания к любому количеству других служб Azure и любому количеству других внешних служб.

Один из вопросов, не описанных в этом руководстве, — проверка подлинности пользователей. Чтобы изучить эту область для веб-приложений, начните с сквозной аутентификации и авторизации пользователей вслужбы приложений Azure.

См. также