Аутентификация пользователей вашего веб-приложения часто необходима и обычно требует специального программирования в вашем приложении. Для приложений Google Cloud Platform вы можете передать эти обязанности службе Identity-Aware Proxy . Если вам нужно ограничить доступ только для выбранных пользователей, никаких изменений в приложении не требуется. Если приложению необходимо знать личность пользователя (например, для сохранения пользовательских настроек на стороне сервера), Identity-Aware Proxy может предоставить это с минимальным кодом приложения.
Что такое прокси-сервер с идентификацией?
Identity-Aware Proxy (IAP) — это служба Google Cloud Platform, которая перехватывает веб-запросы, отправленные вашему приложению, аутентифицирует пользователя, делающего запрос, с помощью службы идентификации Google и пропускает запросы только в том случае, если они исходят от пользователя, которого вы авторизовали. Кроме того, он может изменить заголовки запроса, чтобы включить информацию об аутентифицированном пользователе.
Эта лабораторная работа поможет вам создать собственное приложение, ограничить доступ к нему и получить удостоверение пользователя из IAP.
Что вы будете строить
В этой лабораторной работе вы создадите минимальное веб-приложение с помощью Google App Engine, а затем изучите различные способы использования Identity-Aware Proxy для ограничения доступа к приложению и предоставления ему идентификационной информации пользователя. Ваше приложение будет:
|
Что вы узнаете
- Как написать и развернуть простое приложение App Engine с помощью Python 3.7
- Как включить и отключить IAP, чтобы ограничить доступ к вашему приложению
- Как получить информацию об идентификаторе пользователя из IAP в ваше приложение
- Как криптографически проверить информацию из IAP для защиты от спуфинга
Что вам понадобится
- Современный веб-браузер, такой как Chrome .
- Базовые знания языка программирования Python
Эта лаборатория кода ориентирована на Google App Engine и IAP. Нерелевантные концепции и блоки кода замалчиваются и предоставляются для простого копирования и вставки.
Вы будете работать в среде командной строки Cloud Shell. Начните с открытия этой среды и загрузки в нее примера кода.
Запустите консоль и облачную оболочку
В верхней левой части экспериментальной страницы нажмите кнопку Открыть консоль Google. Вам нужно будет войти в систему с именем пользователя и паролем, указанными под этой кнопкой. |
Все команды в этой кодовой лаборатории будут выполняться в Cloud Shell для проекта, который был создан и открыт для вас. Откройте Cloud Shell, щелкнув значок «Активировать Cloud Shell» в правой части заголовка страницы консоли. Нижняя половина страницы позволит вам вводить и запускать команды. Команды можно запускать с вашего собственного ПК, но сначала вам придется установить и настроить необходимое программное обеспечение для разработки. В Cloud Shell уже есть все необходимые программные инструменты. |
Скачать код
Щелкните область командной строки в Cloud Shell, чтобы вводить команды. Загрузите код с Github, а затем перейдите в папку с кодом:
git clone https://github.com/googlecodelabs/user-authentication-with-iap.git
cd iap-codelab
Эта папка содержит одну подпапку для каждого шага этой лаборатории кода. Вы перейдете к правильной папке для выполнения каждого шага.
Это стандартное приложение App Engine, написанное на 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 для Python 3.7.
gcloud app deploy
Вас могут попросить выбрать регион для развертывания. Выберите любой рядом с вами, который говорит, что он «поддерживает стандарт». Когда вас спросят, хотите ли вы продолжить, введите Y
для подтверждения.
Через несколько минут развертывание должно завершиться, и вы увидите сообщение о том, что вы можете просмотреть свое приложение с помощью gcloud app browse
. Введите эту команду. Если новая вкладка не открывается в вашем браузере, щелкните отображаемую ссылку, чтобы открыть ее в новой вкладке, или при необходимости скопируйте ее в новую вкладку, открытую вручную. Поскольку это приложение запускается в первый раз, оно появится через несколько секунд при запуске облачного экземпляра, и вы должны увидеть следующее окно.
Вы можете открыть тот же URL-адрес с любого компьютера, подключенного к Интернету, чтобы увидеть эту веб-страницу. Доступ пока не ограничен.
Ограничить доступ с помощью IAP
В окне облачной консоли щелкните значок меню в левом верхнем углу страницы, щелкните «Безопасность», а затем «Прокси-сервер с идентификацией». | |
Поскольку вы впервые включили параметр аутентификации для этого проекта, вы увидите сообщение о том, что вы должны настроить экран согласия OAuth, прежде чем сможете использовать IAP. | |
Нажмите КНОПКУ НАСТРОЙКИ СОГЛАСИЯ НА ЭКРАНЕ. Откроется новая вкладка для настройки экрана согласия. |
Заполните необходимые поля соответствующими значениями:
Имя приложения | Пример IAP |
Электронная почта поддержки | Ваша электронная почта. он может быть уже заполнен для вас. |
Авторизованный домен | часть имени хоста URL-адреса приложения, например, iap-example-999999.appspot.com. Вы можете увидеть это в адресной строке веб-страницы Hello World, которую вы ранее открывали. Не включайте начальный Вы должны нажать Enter после заполнения этого значения. |
Ссылка на главную страницу приложения | URL-адрес, который вы использовали для просмотра своего приложения |
Ссылка на Политику конфиденциальности приложений | ссылка на страницу конфиденциальности в приложении, такая же, как ссылка на домашнюю страницу с добавлением /privacy в конце |
Нажмите Сохранить . Вам будет предложено создать учетные данные. Вам не нужно создавать учетные данные для этой лаборатории кода, поэтому вы можете просто закрыть эту вкладку браузера.
Вернитесь на страницу Identity-Aware Proxy и обновите ее. Теперь вы должны увидеть список ресурсов, которые вы можете защитить. Нажмите кнопку-переключатель в столбце IAP в строке приложения App Engine, чтобы включить IAP. | |
Вы увидите доменные имена, которые будут защищены IAP. Нажмите ВКЛЮЧИТЬ. | |
Теперь откройте вкладку браузера и перейдите по URL-адресу вашего приложения. Вам будет представлен экран «Войти через Google», требующий, чтобы вы вошли в систему, чтобы получить доступ к приложению. | |
Войдите в систему с помощью учетной записи Google или G Suite. Вы увидите экран, запрещающий вам доступ. |
Вы успешно защитили свое приложение с помощью IAP, но еще не сообщили IAP, какие учетные записи разрешать.
Вернитесь на страницу Identity-Aware Proxy в консоли, установите флажок рядом с приложением App Engine и посмотрите на боковую панель в правой части страницы. | |
Каждый адрес электронной почты (или адрес группы Google, или доменное имя G Suite), которому должен быть разрешен доступ, должен быть добавлен в качестве участника. Нажмите ДОБАВИТЬ УЧАСТНИКА. Введите свой адрес электронной почты, затем выберите роль пользователя Cloud IAP/IAP-Secured Web App, которую нужно назначить этому адресу. Таким же образом вы можете ввести больше адресов или доменов G Suite. |
Щелкните Сохранить. В нижней части окна появится сообщение «Политика обновлена».
Вернитесь к своему приложению и перезагрузите страницу. Теперь вы должны увидеть свое веб-приложение, так как вы уже вошли в систему с пользователем, которого вы авторизовали. Однако вы все равно можете увидеть страницу «У вас нет доступа», так как IAP не может повторно проверить вашу авторизацию. В этом случае выполните следующие действия:
- Откройте в веб-браузере адрес домашней страницы с
/_gcp_iap/clear_login_cookie
в конце URL-адреса, напримерhttps://iap-example-999999.appspot.com/_gcp_iap/clear_login_cookie
. - Вы увидите новый экран «Войти через Google», в котором уже отображается ваша учетная запись. Не нажимайте на учетную запись. Вместо этого нажмите «Использовать другую учетную запись» и повторно введите свои учетные данные.
- Эти шаги заставят IAP перепроверить ваш доступ, и теперь вы должны увидеть главный экран вашего приложения.
Если у вас есть доступ к другому браузеру или вы можете использовать режим инкогнито в своем браузере и у вас есть другая действующая учетная запись GMail или GSuite, вы можете использовать этот браузер для перехода на страницу своего приложения и входа в систему с другой учетной записью. Поскольку эта учетная запись не была авторизована, она увидит экран «У вас нет доступа» вместо вашего приложения.
После того, как приложение защищено с помощью IAP, оно может использовать идентификационную информацию, которую IAP предоставляет в заголовках веб-запросов, через которые оно проходит. На этом этапе приложение получит адрес электронной почты вошедшего в систему пользователя и постоянный уникальный идентификатор пользователя, назначенный этому пользователю службой идентификации Google. Эти данные будут отображаться пользователю на странице приветствия.
Это шаг 2, и последний шаг завершился открытием Cloud Shell в iap-codelab/1-HelloWorld
. Перейдите в папку для этого шага:
cd ~/iap-codelab/2-HelloUser
Развертывание в App Engine
Поскольку развертывание занимает несколько минут, начните с развертывания приложения в стандартной среде App Engine для 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
имеют префикс account.google.com :, показывающий, откуда была взята информация. Ваше приложение может удалить все до двоеточия включительно, чтобы получить необработанные значения, если это необходимо.
Отключить внутриигровые покупки
Что произойдет с этим приложением, если IAP отключен или каким-либо образом обойден (например, другими приложениями, работающими в том же облачном проекте)? Отключите IAP, чтобы увидеть.
В окне облачной консоли щелкните значок меню в левом верхнем углу страницы, щелкните «Безопасность», а затем «Прокси-сервер с идентификацией». Щелкните переключатель IAP рядом с приложением App Engine, чтобы отключить IAP. |
Вы будете предупреждены, что это позволит всем пользователям получить доступ к приложению.
Обновите веб-страницу приложения. Вы должны увидеть ту же страницу, но без какой-либо информации о пользователе:
Поскольку приложение теперь не защищено, пользователь может отправить веб-запрос, который прошел через IAP. Например, для этого вы можете запустить следующую команду curl из Cloud Shell (замените <your-url-here> правильным 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 показывает решение.
Если существует риск отключения или обхода 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 для Python 3.7:
gcloud app deploy
Когда вас спросят, хотите ли вы продолжить, введите Y для подтверждения. Через несколько минут развертывание должно завершиться. Пока вы ждете, вы можете проверить файлы приложения, как описано ниже.
Когда развертывание будет готово, вы увидите сообщение о том, что вы можете просмотреть свое приложение с помощью gcloud app browse
. Введите эту команду. Если в вашем браузере не открывается новая вкладка, скопируйте отображаемую ссылку и откройте ее в новой вкладке в обычном режиме.
Вспомните, что вы отключили IAP на шаге 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.
Вы развернули веб-приложение App Engine. На шаге 1 вы ограничили доступ к приложению только выбранными вами пользователями. На шаге 2 вы извлекли и отобразили идентификационные данные пользователей, которым IAP разрешил доступ к вашему приложению, и увидели, как эта информация может быть подделана, если IAP отключен или обойден. На шаге 3 вы проверили криптографически подписанные утверждения личности пользователя, которые нельзя подделать.
Единственными ресурсами Google Cloud Platform, которые вы использовали в этой лаборатории кода, являются экземпляры App Engine. Каждый раз, когда вы развертываете приложение, создается новая версия, которая продолжает существовать до тех пор, пока не будет удалена. Выйдите из лаборатории, чтобы удалить проект и все ресурсы в нем.