1. Введение
Аутентификация пользователей вашего веб-приложения часто необходима и обычно требует специального программирования в вашем приложении. Для приложений Google Cloud Platform вы можете передать эти обязанности службе Identity-Aware Proxy . Если вам нужно ограничить доступ только для выбранных пользователей, никаких изменений в приложении не требуется. Если приложению необходимо знать личность пользователя (например, для хранения пользовательских настроек на стороне сервера), Identity-Aware Proxy может предоставить эту информацию с минимальным количеством кода приложения.
Что такое прокси-сервер с поддержкой идентификации?
Identity-Aware Proxy (IAP) — это сервис Google Cloud Platform, который перехватывает веб-запросы, отправляемые в ваше приложение, аутентифицирует пользователя, отправляющего запрос, с помощью службы Google Identity Service и пропускает запросы только в том случае, если они поступают от авторизованного вами пользователя. Кроме того, он может изменять заголовки запроса, чтобы включить информацию об авторизованном пользователе.
В этом практическом занятии вы узнаете, как создать собственное приложение, ограничить к нему доступ и получить идентификационные данные пользователя из IAP.
Что вы построите
В этом практическом занятии вы создадите минимальное веб-приложение с помощью Google App Engine, а затем изучите различные способы использования Identity-Aware Proxy для ограничения доступа к приложению и предоставления ему информации об идентификации пользователя. Ваше приложение будет:
|
|
Что вы узнаете
- Как написать и развернуть простое приложение App Engine с использованием Python 3.7
- Как включить и отключить встроенные покупки (IAP) для ограничения доступа к вашему приложению
- Как получить информацию об идентификации пользователя из встроенных покупок (IAP) в ваше приложение
- Как криптографически проверить информацию из IAP для защиты от подделки
Что вам понадобится
- Современный веб-браузер, например Chrome .
- Базовые знания языка программирования Python.
Данный практический урок посвящен Google App Engine и встроенным покупкам (IAP). Несущественные концепции и фрагменты кода опущены и предоставлены для простого копирования и вставки.
2. Настройка
Вы будете работать в среде командной строки Cloud Shell. Начните с открытия этой среды и загрузки в неё примера кода.
Запустите консоль и облачную оболочку.
В левой верхней части страницы лаборатории нажмите кнопку «Открыть Google Console». Вам потребуется войти в систему, используя имя пользователя и пароль, указанные под этой кнопкой. |
|
Все команды в этом практическом задании будут выполняться в оболочке Cloud Shell для проекта, который был создан и открыт для вас. Откройте Cloud Shell, щелкнув значок «Активировать Cloud Shell», расположенный в правой части заголовка страницы консоли. В нижней половине страницы вы сможете вводить и запускать команды. Команды можно запускать и с вашего компьютера, но для этого сначала необходимо установить и настроить необходимое программное обеспечение для разработки. В Cloud Shell уже есть все необходимые программные инструменты. |
|
Скачать код
Щелкните область командной строки в Cloud Shell, чтобы ввести команды. Загрузите код с Github, а затем перейдите в папку с кодом:
git clone https://github.com/googlecodelabs/user-authentication-with-iap.git
cd user-authentication-with-iap
Эта папка содержит по одной подпапке для каждого шага данного практического задания. Для выполнения каждого шага вам нужно будет перейти в соответствующую папку.
3. Шаг 1 — Разверните приложение и защитите его с помощью IAP.
Это приложение App Engine Standard, написанное на Python 3.7, которое просто отображает приветственную страницу "Hello, World". Мы развернем и протестируем его, а затем ограничим доступ к нему с помощью встроенных покупок (IAP).
Просмотрите код приложения.
Перейдите из основной папки проекта в подпапку 1-HelloWorld , содержащую код для этого шага.
cd 1-HelloWorld
Код приложения находится в файле main.py Он использует веб-фреймворк Flask для ответа на веб-запросы содержимым шаблона. Этот файл шаблона находится в templates/index.html и на данном этапе содержит только обычный HTML-код. Второй файл шаблона содержит примерный образец политики конфиденциальности в templates/privacy.html .
Есть еще два файла: requirements.txt , в котором перечислены все нестандартные библиотеки Python, используемые приложением, и app.yaml который сообщает Google Cloud Platform, что это приложение на Python 3.7 App Engine.
Вы можете вывести список всех файлов в командной оболочке с помощью команды `cat`, например:
cat main.py
Или вы можете открыть редактор кода Cloud Shell, щелкнув значок карандаша в правом верхнем углу окна Cloud Shell, и изучить код таким образом.
На этом этапе вам не нужно изменять никакие файлы.
Развернуть в App Engine
Теперь разверните приложение в среде App Engine Standard для Python 3.7.
gcloud app deploy
Возможно, вас попросят выбрать регион для развертывания. Выберите любой регион поблизости, в котором указано, что он «поддерживает стандарт». Когда вас спросят, хотите ли вы продолжить, введите Y если да.
Через несколько минут развертывание должно завершиться, и вы увидите сообщение о том, что можете просмотреть свое приложение с помощью gcloud app browse . Введите эту команду. Если в вашем браузере не открывается новая вкладка, щелкните отображаемую ссылку, чтобы открыть ее в новой вкладке, или скопируйте ее в открытую вручную новую вкладку, если это необходимо. Поскольку это первый запуск приложения, потребуется несколько секунд, пока запускается облачный экземпляр, после чего вы должны увидеть следующее окно.

Вы можете открыть этот же URL-адрес с любого компьютера, подключенного к Интернету, чтобы просмотреть эту веб-страницу. Доступ пока не ограничен.
Ограничение доступа с помощью IAP
В окне консоли облака щелкните значок меню в левом верхнем углу страницы, выберите «Безопасность», а затем «Прокси-сервер с поддержкой идентификации». |
|
Поскольку вы впервые включаете аутентификацию для этого проекта, вы увидите сообщение о том, что перед использованием IAP необходимо настроить экран согласия OAuth. |
|
Нажмите кнопку «НАСТРОИТЬ ЭКРАН СОГЛАСИЯ». Откроется новая вкладка для настройки экрана согласия. |
|
Заполните необходимые поля соответствующими значениями:
Название приложения | Пример IAP |
Электронная почта службы поддержки | Ваш адрес электронной почты. Возможно, он уже заполнен автоматически. |
Авторизованный домен | Часть URL-адреса приложения, содержащая имя хоста, например, iap-example-999999.appspot.com. Вы можете увидеть это в адресной строке веб-страницы Hello World, которую вы ранее открывали. Не добавляйте в начале URL-адреса |
Ссылка на главную страницу приложения | URL-адрес, который вы использовали для просмотра своего приложения. |
Ссылка на политику конфиденциальности приложения | Ссылка на страницу конфиденциальности в приложении, аналогичная ссылке на главной странице, с добавлением /privacy в конце. |
Нажмите «Сохранить» . Вам будет предложено создать учетные данные. Для этого практического занятия создавать учетные данные не нужно, поэтому вы можете просто закрыть эту вкладку браузера.
Вернитесь на страницу «Прокси с поддержкой идентификации» и обновите её. Теперь вы должны увидеть список ресурсов, которые можно защитить. Нажмите кнопку-переключатель в столбце «Встроенные покупки» в строке приложения App Engine, чтобы включить встроенные покупки. |
|
Вы увидите доменные имена, которые будут защищены IAP. Нажмите «ВКЛЮЧИТЬ». |
|
Теперь откройте вкладку браузера и перейдите по URL-адресу вашего приложения. Вам будет предложено войти через Google, чтобы получить доступ к приложению. |
|
Войдите в систему с помощью учетной записи Google или GSuite. Вы увидите сообщение об отказе в доступе. |
|
Вы успешно защитили свое приложение с помощью IAP, но еще не указали IAP, каким учетным записям разрешить доступ.
Вернитесь на страницу «Прокси-сервер с поддержкой идентификации» в консоли, установите флажок рядом с приложением App Engine и посмотрите на боковую панель справа от страницы. |
|
Каждый адрес электронной почты (или адрес группы Google, или доменное имя GSuite), которому должен быть предоставлен доступ, необходимо добавить в качестве участника. Нажмите «ДОБАВИТЬ УЧАСТНИКА». Введите свой адрес электронной почты, затем выберите роль «Пользователь Cloud IAP/IAP-Secured Web App», чтобы назначить ее этому адресу. Таким же образом можно ввести и другие адреса или домены GSuite. |
|
Нажмите «Сохранить». В нижней части окна появится сообщение «Политика обновлена».
Вернитесь в приложение и перезагрузите страницу. Теперь вы должны увидеть веб-приложение, поскольку вы уже вошли в систему под авторизованным пользователем. Однако вы все еще можете видеть страницу «У вас нет доступа», поскольку IAP может не перепроверять вашу авторизацию. В этом случае выполните следующие действия:
- Откройте веб-браузер и перейдите по адресу домашней страницы, добавив в конец URL-адреса
/_gcp_iap/clear_login_cookie, например:https://iap-example-999999.appspot.com/_gcp_iap/clear_login_cookie. - Вы увидите новый экран «Вход через Google», где уже будет отображаться ваша учетная запись. Не нажимайте на эту учетную запись. Вместо этого нажмите «Использовать другую учетную запись» и повторно введите свои учетные данные.
- Выполнив эти шаги, IAP повторно проверит ваш доступ, и теперь вы должны увидеть главный экран вашего приложения.
Если у вас есть доступ к другому браузеру или вы можете использовать режим инкогнито в своем браузере, и у вас есть другая действующая учетная запись Gmail или GSuite, вы можете использовать этот браузер для перехода на страницу вашего приложения и входа в систему с помощью другой учетной записи. Поскольку эта учетная запись не авторизована, вместо вашего приложения вы увидите экран «У вас нет доступа».
4. Шаг 2 — Доступ к информации, позволяющей идентифицировать пользователя.
После защиты приложения с помощью IAP оно может использовать информацию об идентификации, предоставляемую IAP в заголовках веб-запросов. На этом этапе приложение получит адрес электронной почты вошедшего в систему пользователя и постоянный уникальный идентификатор пользователя, присвоенный ему службой идентификации Google. Эти данные будут отображены пользователю на приветственной странице.
Это шаг 2, и предыдущий шаг завершился открытием Cloud Shell в папке iap-codelab/1-HelloWorld . Перейдите в папку, соответствующую этому шагу:
cd ~/iap-codelab/2-HelloUser
Развернуть в App Engine
Поскольку развертывание занимает несколько минут, начните с развертывания приложения в среде App Engine Standard для Python 3.7:
gcloud app deploy
Когда вас спросят, хотите ли вы продолжить, введите Y, если хотите. Через несколько минут развертывание должно завершиться. Пока вы ждете, вы можете изучить файлы приложения, как описано ниже.
Когда развертывание будет готово, вы увидите сообщение о том, что можете просмотреть свое приложение с помощью gcloud app browse . Введите эту команду. Если в вашем браузере не открывается новая вкладка, скопируйте отображаемую ссылку и откройте ее в новой вкладке обычным способом. Вы должны увидеть страницу, похожую на следующую:

Возможно, вам потребуется подождать несколько минут, пока новая версия вашего приложения заменит предыдущую. При необходимости обновите страницу, чтобы увидеть страницу, похожую на приведенную выше.
Изучите файлы приложения.
В этой папке содержится тот же набор файлов, что и на шаге 1, но два файла были изменены: main.py и templates/index.html . Программа была изменена таким образом, чтобы получать информацию о пользователе, которую IAP предоставляет в заголовках запроса, и теперь шаблон отображает эти данные.
В main.py есть две строки, которые получают предоставленные IAP данные об идентификации:
user_email = request.headers.get('X-Goog-Authenticated-User-Email')
user_id = request.headers.get('X-Goog-Authenticated-User-ID')
Заголовки X-Goog-Authenticated-User- предоставляются IAP, и имена нечувствительны к регистру, поэтому их можно указывать как в нижнем, так и в верхнем регистре, если это предпочтительнее. Теперь оператор render_template включает эти значения, чтобы их можно было отобразить:
page = render_template('index.html', email=user_email, id=user_id)
В шаблоне index.html эти значения можно отобразить, заключив имена в двойные фигурные скобки:
Hello, {{ email }}! Your persistent ID is {{ id }}.
Как видите, предоставленные данные имеют префикс accounts.google.com :, указывающий на источник информации. При желании ваше приложение может удалить все символы, включая двоеточие, чтобы получить исходные значения.
Отключите встроенные покупки
Что произойдет с этим приложением, если IAP будет отключен или каким-либо образом обойден (например, другими приложениями, работающими в том же облачном проекте)? Отключите IAP, чтобы узнать.
В окне облачной консоли щелкните значок меню в верхнем левом углу страницы, выберите «Безопасность», а затем «Прокси с поддержкой идентификации». Щелкните переключатель IAP рядом с приложением App Engine, чтобы отключить IAP. |
|
Вы получите предупреждение о том, что это позволит всем пользователям получить доступ к приложению.
Обновите веб-страницу приложения. Вы должны увидеть ту же страницу, но без информации о пользователе:

Поскольку приложение теперь не защищено, пользователь может отправить веб-запрос, который будет выглядеть так, будто он прошел через IAP. Например, для этого можно выполнить следующую команду curl из Cloud Shell (замените <ваш-URL-здесь> на правильный URL-адрес вашего приложения):
curl -X GET <your-url-here> -H "X-Goog-Authenticated-User-Email: totally fake email"
Веб-страница отобразится в командной строке и будет выглядеть следующим образом:
<!doctype html>
<html>
<head>
<title>IAP Hello User</title>
</head>
<body>
<h1>Hello World</h1>
<p>
Hello, totally fake email! Your persistent ID is None.
</p>
<p>
This is step 2 of the <em>User Authentication with IAP</em>
codelab.
</p>
</body>
</html>
Приложение никак не может узнать, что IAP отключен или обойден. В случаях, когда это представляет потенциальный риск, на шаге 3 показано решение.
5. Шаг 3 — Использование криптографической проверки
Если существует риск отключения или обхода IAP, ваше приложение может проверить достоверность получаемой информации об идентификации. Для этого используется третий заголовок веб-запроса, добавляемый IAP, называемый X-Goog-IAP-JWT-Assertion . Значение заголовка представляет собой криптографически подписанный объект, который также содержит данные об идентификации пользователя. Ваше приложение может проверить цифровую подпись и использовать данные, предоставленные в этом объекте, чтобы убедиться, что они были предоставлены IAP без изменений.
Проверка цифровой подписи требует нескольких дополнительных шагов, таких как получение последнего набора открытых ключей Google. Необходимость этих дополнительных шагов для вашего приложения можно определить, исходя из риска отключения или обхода встроенных покупок (IAP) и конфиденциальности приложения.
Это шаг 3, и предыдущий шаг завершился открытием Cloud Shell в папке iap-codelab/2-HelloUser . Перейдите в папку, соответствующую этому шагу:
cd ~/iap-codelab/3-HelloVerifiedUser
Развернуть в App Engine
Разверните приложение в среде App Engine Standard для Python 3.7:
gcloud app deploy
Когда вас спросят, хотите ли вы продолжить, введите Y, если хотите. Через несколько минут развертывание должно завершиться. Пока вы ждете, вы можете изучить файлы приложения, как описано ниже.
Когда развертывание будет готово, вы увидите сообщение о том, что можете просмотреть свое приложение с помощью gcloud app browse . Введите эту команду. Если в вашем браузере не открывается новая вкладка, скопируйте отображаемую ссылку и откройте ее в новой вкладке обычным способом.
Напомним, что на шаге 2 вы отключили встроенные покупки (IAP), поэтому данные о покупках в приложении не передаются. Вы должны увидеть страницу, похожую на следующую:

Как и прежде, вам, возможно, придётся подождать несколько минут, пока новая версия станет доступна, чтобы увидеть обновлённую версию страницы.
Поскольку функция IAP отключена, информация о пользователе недоступна. Теперь включите IAP обратно.
В окне облачной консоли щелкните значок меню в верхнем левом углу страницы, выберите «Безопасность», а затем «Прокси с поддержкой идентификации». Щелкните переключатель IAP рядом с приложением App Engine, чтобы снова включить IAP. |
|
Обновите страницу. Страница должна выглядеть следующим образом:

Обратите внимание, что адрес электронной почты, предоставленный проверенным методом, не имеет префикса accounts.google.com:
Если функция IAP отключена или обойдена, проверенные данные либо будут отсутствовать, либо будут недействительными, поскольку они не могут иметь действительную подпись, если она не была создана владельцем закрытых ключей Google.
Изучите файлы приложения.
Эта папка содержит тот же набор файлов, что и на шаге 2, с двумя измененными файлами и одним новым файлом. Новый файл — auth.py , который предоставляет метод user() для получения и проверки криптографически подписанной информации об идентификации. Измененные файлы — main.py и templates/index.html , которые теперь используют результаты этого метода. Для сравнения также показаны непроверенные заголовки, найденные на шаге 2.
Новая функциональность в основном реализована в функции user() :
def user():
assertion = request.headers.get('X-Goog-IAP-JWT-Assertion')
if assertion is None:
return None, None
info = jwt.decode(
assertion,
keys(),
algorithms=['ES256'],
audience=audience()
)
return info['email'], info['sub']
assertion представляет собой криптографически подписанные данные, предоставленные в указанном заголовке запроса. Код использует библиотеку для проверки и декодирования этих данных. Проверка использует открытые ключи, предоставленные Google, для проверки подписанных данных и определения целевой аудитории (по сути, проекта Google Cloud, который защищается). Вспомогательные функции keys() и audience() собирают и возвращают эти значения.
Подписанный объект содержит два необходимых нам элемента данных: подтвержденный адрес электронной почты и уникальный идентификатор (предоставляемый в стандартном поле sub для подписчика).
На этом завершается Шаг 3.
6. Резюме
Вы развернули веб-приложение App Engine. На шаге 1 вы ограничили доступ к приложению только для выбранных вами пользователей. На шаге 2 вы получили и отобразили идентификационные данные пользователей, которым IAP разрешил доступ к вашему приложению, и увидели, как эта информация может быть подделана, если IAP будет отключен или обойден. На шаге 3 вы проверили криптографически подписанные утверждения об идентификации пользователя, которые невозможно подделать.
7. Уборка
Единственными ресурсами Google Cloud Platform, которые вы использовали в этом практическом задании, были экземпляры App Engine. При каждом развертывании приложения создавалась новая версия, которая продолжает существовать до тех пор, пока не будет удалена. Чтобы удалить проект и все ресурсы в нем, выйдите из задания.











