Uwierzytelnianie użytkowników aplikacji internetowej jest często niezbędne i zwykle wymaga specjalnego zaprogramowania się w aplikacji. W przypadku aplikacji Google Cloud Platform te obowiązki można przekazać do usługi serwerów proxy identyfikujących tożsamość. Jeśli chcesz przyznać dostęp tylko wybranym użytkownikom, nie musisz wprowadzać w aplikacji żadnych zmian. Jeśli do aplikacji muszą być przekazywane informacje o tożsamości użytkownika (aby na przykład przechowywać jego preferencje na serwerze), zadanie to może wykonać Serwer proxy identyfikujący tożsamość, przy czym wymaga to minimalnej ingerencji w kod aplikacji.
Co to jest Serwer proxy identyfikujący tożsamość?
Serwer proxy identyfikujący tożsamość (IAP) to usługa Google Cloud Platform, która przechwytuje wysyłane do aplikacji żądania sieciowe, uwierzytelnia użytkownika, przesyłając żądania do usługi tożsamości Google, i przekazuje do aplikacji tylko te z nich, które pochodzą od autoryzowanego użytkownika. Dodatkowo może modyfikować nagłówki żądań, dodając do nich informacje o uwierzytelnionym użytkowniku.
Dzięki nim dowiesz się, jak utworzyć własną aplikację, ograniczyć do niej dostęp i uzyskać tożsamość użytkownika za pomocą IAP.
Co utworzysz
W ramach tego ćwiczenia przygotujesz minimalną aplikację internetową za pomocą Google App Engine, a następnie poznasz różne sposoby na używanie serwera proxy identyfikującego tożsamość w celu ograniczenia dostępu do niego i przekazywania do niego informacji o tożsamości użytkowników. Twoja aplikacja będzie:
|
Czego się nauczysz:
- Jak pisać i wdrażać proste aplikacje App Engine za pomocą języka Python 3.7
- Jak ograniczać dostęp do aplikacji przy użyciu IAP i wyłączać te ograniczenia.
- Jak pobierać informacje o tożsamości użytkowników z IAP i przekazywać je do aplikacji.
- Jak kryptograficznie sprawdzać informacje z IAP i chronić aplikację przed podszywaniem się.
Czego potrzebujesz
- Nowoczesna przeglądarka, na przykład Chrome.
- Podstawowa znajomość języka programowania w języku Python
Te ćwiczenia skupiają się na Google App Engine i zakupach w aplikacji. Nieistotne koncepcje i bloki kodu zostały zamaskowane. Można je po prostu skopiować i wkleić.
Będziesz pracować w środowisku wiersza poleceń Cloud Shell. Otwórz to środowisko i pobierz do niego przykładowy kod.
Uruchamianie konsoli i Cloud Shell
W lewym górnym rogu strony modułu kliknij przycisk Otwórz konsolę Google. Musisz zalogować się, korzystając z nazwy użytkownika i hasła widocznych pod tym przyciskiem. |
Wszystkie polecenia z tego ćwiczenia będą wykonywane w Cloud Shell w projekcie, który został dla Ciebie utworzony. Kliknij ikonę Aktywuj Cloud Shell, która znajduje się po prawej stronie nagłówka strony konsoli. W dolnej połowie strony możesz wpisywać i uruchamiać polecenia. Polecenia możesz uruchamiać z własnego komputera, ale najpierw musisz zainstalować i skonfigurować odpowiednie oprogramowanie dla programistów. Cloud Shell ma już wszystkie potrzebne narzędzia. |
Pobierz kod
Kliknij obszar wiersza poleceń w Cloud Shell, aby móc wpisywać polecenia. Pobierz kod z GitHuba, a następnie przejdź do folderu kodu:
git clone https://github.com/googlecodelabs/user-authentication-with-iap.git
cd iap-codelab
Ten folder zawiera po 1 podfolderze na każdy etap ćwiczenia z programowania. Podczas wykonywania określonego kroku przejdź do odpowiadającego mu folderu.
To jest standardowa aplikacja App Engine napisana w języku Python 3.7, w której wyświetla się strona powitalna. Wdrożymy i przetestujemy ją, a następnie ograniczymy do niej dostęp przy użyciu IAP.
Sprawdzanie kodu aplikacji
Zmień go z głównego folderu projektu na podfolder 1-HelloWorld
zawierający kod tego kroku.
cd 1-HelloWorld
Kod aplikacji jest w pliku main.py
. Wykorzystuje on platformę internetową Flask, która w odpowiedzi na żądania internetowe zawiera treść szablonu. Ten plik szablonu to templates/index.html
, a w tym kroku znajduje się tylko zwykły kod HTML. Drugi plik szablonu zawiera szkieletową politykę prywatności z templates/privacy.html
.
Istnieją też 2 inne pliki: requirements.txt
zawiera wszystkie inne niż domyślne biblioteki Pythona używane przez aplikację, a app.yaml
informuje Google Cloud Platform, że jest to aplikacja App Engine w języku Python 3.7.
Każdy z tych plików można wyświetlić w powłoce przy użyciu polecenia cat, na przykład:
cat main.py
Możesz też otworzyć edytor kodu Cloud Shell, klikając ikonę ołówka w prawym górnym rogu okna Cloud Shell i w ten sposób analizować kod.
W tym kroku nie trzeba modyfikować żadnych plików.
Wdrażanie w App Engine
Teraz wdróż aplikację w standardowym środowisku App Engine języka Python 3.7
gcloud app deploy
Może pojawić się prośba o wybranie regionu, w którym chcesz wykonać wdrożenie. Wybierz ten, który znajduje się w pobliżu i obsługuje „standardowy” Gdy pojawi się pytanie, czy chcesz kontynuować, wpisz Y
(tak).
Po kilku minutach wdrożenie powinno zostać ukończone. Wyświetli się komunikat informujący o tym, że można wyświetlić aplikację przy użyciu gcloud app browse
. Wpisz polecenie. Jeśli nowa karta nie otwiera się w przeglądarce, kliknij wyświetlany link, aby otworzyć ją w nowej karcie, lub w razie potrzeby skopiuj ją do ręcznie otwartej nowej karty. Ponieważ aplikacja jest uruchamiana po raz pierwszy, pojawi się po kilku sekundach. W tym czasie jest uruchamiana instancja chmury. Zostanie wyświetlone następujące okno.
Ten adres URL można otworzyć na dowolnym komputerze podłączonym do Internetu i wyświetlić tę stronę internetową. Dostęp nie został jeszcze ograniczony.
Ograniczanie dostępu za pomocą IAP
W oknie Cloud Console kliknij ikonę menu w lewym górnym rogu strony i wybierz Zabezpieczenia. | |
Ponieważ w tym projekcie włączono opcję uwierzytelniania po raz pierwszy, zobaczysz komunikat z informacją, że przed użyciem IAP musisz skonfigurować ekran zgody OAuth. | |
Kliknij SKONFIGURUJ PRZYCISK ZGADZENIA. Otworzy się nowa karta, na której możesz skonfigurować ekran zgody. |
Podaj odpowiednie wartości w wymaganych, pustych polach:
Nazwa aplikacji | Przykład zakupów w aplikacji |
Adres e-mail pomocy | Twój adres e-mail. Może być już wypełniony. |
Autoryzowana domena | część nazwy hosta adresu URL aplikacji, np. iap-example-999999.appspot.com. Znajdziesz ją w pasku adresu otwartej wcześniej strony internetowej Hello World. Nie zaczynaj od Po wpisaniu tej wartości naciśnij Enter. |
Link do strony głównej aplikacji | Adres URL użyty do wyświetlenia aplikacji |
Link do polityki prywatności aplikacji | link do strony prywatności w aplikacji, taki sam jak link do strony głównej, który ma na końcu fragment /privacy |
Kliknij Zapisz. Pojawi się prośba o utworzenie danych logowania. Nie musisz tworzyć danych logowania na potrzeby tych ćwiczeń z programowania, więc możesz po prostu zamknąć tę kartę przeglądarki.
Wróć na stronę Serwer proxy identyfikujący tożsamość i odśwież ją. Powinna być teraz widoczna lista zasobów, które można zabezpieczyć. Kliknij przycisk przełączania w kolumnie zakupów w wierszu aplikacji App Engine, aby włączyć IAP. | |
Zobaczysz nazwy domen, które będą chronione przez IAP. Kliknij WŁĄCZ. | |
Teraz otwórz kartę przeglądarki i przejdź na adres URL swojej aplikacji. Pojawi się ekran „Zaloguj się przez Google”, na którym musisz się zalogować, aby uzyskać dostęp do aplikacji. | |
Zaloguj się na konto Google lub G Suite. Pojawi się ekran z odmową dostępu. |
Aplikacja została zabezpieczona przy użyciu IAP, ale nie przesłano jeszcze na ten serwer informacji o kontach, które mają być akceptowane.
Wróć na stronę konsoli Serwer proxy identyfikujący tożsamość, zaznacz pole wyboru obok aplikacji App Engine i zwróć uwagę na pasek boczny po prawej stronie ekranu. | |
Każdy adres e-mail, adres grupy dyskusyjnej Google lub nazwę domeny G Suite, które mają mieć dostęp, należy dodać jako użytkownika. Kliknij DODAJ CZŁONKA. Wpisz swój adres e-mail, a następnie wybierz rolę użytkownika aplikacji internetowej Cloud IAP/zabezpieczonej przez IAP, aby przypisać go do tego adresu. Możesz w ten sam sposób wpisać więcej adresów lub domen G Suite. |
Kliknij Zapisz. U dołu okna pojawi się komunikat „Zasada zaktualizowana”.
Wróć do aplikacji i załaduj ponownie stronę. Teraz aplikacja powinna być widoczna, ponieważ nastąpiło logowanie przy użyciu autoryzowanego konta użytkownika. Nadal możesz jednak zobaczyć stronę „Nie masz dostępu”, ponieważ IAP może nie zweryfikować ponownie Twojej autoryzacji. W tym przypadku wykonaj te czynności:
- Otwórz w przeglądarce stronę z adresem strony głównej, dodając
/_gcp_iap/clear_login_cookie
na końcu adresu URL tak jak whttps://iap-example-999999.appspot.com/_gcp_iap/clear_login_cookie
. - Pojawi się nowy ekran Zaloguj się przez Google, na którym jest już wyświetlane Twoje konto. Nie klikaj tego konta. Zamiast tego kliknij Użyj innego konta i wpisz ponownie swoje dane logowania.
- Wykonanie tych czynności spowoduje, że IAP ponownie sprawdzi Twój dostęp – ekran główny aplikacji powinien być już widoczny.
Jeśli masz inne ważne konto Gmail lub G Suite i dostęp do innej przeglądarki albo możesz użyć trybu incognito, przejdź w tej przeglądarce na stronę swojej aplikacji i zaloguj się przy użyciu tego innego konta. Ponieważ to konto nie zostało autoryzowane, zamiast aplikacji pojawi się ekran „Nie masz dostępu”.
Aplikacja zabezpieczona przy użyciu IAP może używać informacji o tożsamości dostarczanych przez IAP w nagłówkach przekazywanych żądań sieciowych. W tym kroku aplikacja pobierze adres e-mail i stały, unikalny identyfikator zalogowanego użytkownika przypisany do niego przez usługę tożsamości Google. Te dane zostaną wyświetlone na stronie powitalnej.
To już krok 2, a ostatni krok został zakończony przez otwarcie Cloud Shell w folderze iap-codelab/1-HelloWorld
. Zmień folder, aby wykonać ten krok:
cd ~/iap-codelab/2-HelloUser
Wdróż w App Engine
Wdrożenie zajmuje kilka minut, więc zacznij od wdrożenia aplikacji w standardowym środowisku App Engine języka Python 3.7:
gcloud app deploy
Na pytanie, czy chcesz kontynuować, wpisz Y, aby potwierdzić. Aplikacja powinna zostać wdrożona w ciągu kilku minut. Czekając na zakończenie tego procesu, możesz przejrzeć pliki aplikacji w opisany poniżej sposób.
Gdy wdrożenie będzie gotowe, pojawi się komunikat informujący o tym, że można wyświetlić aplikację przy użyciu gcloud app browse
. Wpisz polecenie. Jeśli w przeglądarce nie otworzy się nowa karta, skopiuj wyświetlony link i otwórz go w nowej karcie, tak jak robisz to zwykle. Efekt będzie podobny do tego:
Zastąpienie wcześniejszej wersji aplikacji jej nową wersją może potrwać kilka minut. W razie potrzeby odśwież stronę, aby wyświetlić ekran podobny do ekranu widocznego powyżej.
Sprawdzanie plików aplikacji
Ten folder zawiera ten sam zestaw plików co w kroku 1, ale dwa z nich zostały zmienione: main.py
i templates/index.html
. Program został zmieniony tak, aby mógł pobierać informacje o użytkownikach dostarczane przez IAP w nagłówkach. Szablon wyświetla teraz te dane.
W main.py
są 2 wiersze, które pobierają dane o tożsamości dostarczane przez IAP:
user_email = request.headers.get('X-Goog-Authenticated-User-Email')
user_id = request.headers.get('X-Goog-Authenticated-User-ID')
W nagłówkach X-Goog-Authenticated-User-
podaje się przez IAP, a w nazwach nie jest rozróżniana wielkość liter, więc może być podana wielkimi lub małymi literami. Instrukcja render_template zawiera teraz te wartości, więc można je wyświetlić:
page = render_template('index.html', email=user_email, id=user_id)
Te wartości można wyświetlić przy użyciu szablonu index.html, umieszczając nazwy w podwójnych nawiasach klamrowych:
Hello, {{ email }}! Your persistent ID is {{ id }}.
Jak widać, podane dane mają przedrostek accounts.google.com
: pokazuje, skąd pochodzą informacje. W razie potrzeby Twoja aplikacja może usunąć wszystko, co znajduje się przed dwukropkiem (oraz sam dwukropek), uzyskując w ten sposób czyste wartości.
Wyłączanie IAP
Co stanie się z tą aplikacją, gdy IAP zostanie wyłączony lub w jakiś sposób pominięty (na przykład przez inne aplikacje działające w tym samym projekcie w chmurze)? Wyłącz IAP, aby to sprawdzić.
W oknie Cloud Console kliknij ikonę menu w lewym górnym rogu strony i wybierz Zabezpieczenia. Kliknij przełącznik IAP obok aplikacji App Engine, aby ją wyłączyć. |
Pojawi się ostrzeżenie informujące o tym, że po wykonaniu tej czynności wszyscy użytkownicy będą mieli dostęp do aplikacji.
Odśwież stronę internetową aplikacji. Powinna pojawić się ta sama strona, jednak bez żadnych informacji o użytkowniku:
Ponieważ aplikacja nie jest już chroniona, można podjąć próbę wysłania żądań sieciowych, które wyglądają jak przekazane przez IAP. Aby to zrobić, możesz na przykład wykonać to polecenie curl w Cloud Shell (zastąp ciąg <your-url-here> prawidłowym adresem URL aplikacji):
curl -X GET <your-url-here> -H "X-Goog-Authenticated-User-Email: totally fake email"
Strona internetowa będzie wyświetlana w wierszu polecenia i wygląda tak:
<!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>
Aplikacja nie może w żaden sposób stwierdzić, że IAP został wyłączony lub pominięty. W przypadkach gdy stanowi to potencjalne zagrożenie, krok 3 przedstawia rozwiązanie.
Jeśli istnieje ryzyko, że IAP zostanie wyłączony lub pominięty, w aplikacji można uwzględnić mechanizmy sprawdzające, czy odbierane informacje o tożsamości są prawidłowe. Wykorzystuje trzeci nagłówek żądania internetowego dodany przez IAP, czyli X-Goog-IAP-JWT-Assertion
. Wartością tego nagłówka jest kryptograficznie podpisany obiekt, który zawiera także informacje o tożsamości użytkownika. Aplikacja może zweryfikować podpis cyfrowy i użyć danych dostarczonych w tym obiekcie, aby sprawdzić, czy żądanie przekazane przez IAP nie zostało w żaden sposób zmodyfikowane.
Sprawdzenie podpisu cyfrowego wymaga wykonania kilku dodatkowych kroków, takich jak pobranie najnowszego zestawu kluczy publicznych Google. Decyzję o tym, czy dana aplikacja powinna wykonywać te dodatkowe kroki, można podjąć, oceniając ryzyko wyłączenia lub pominięcia IAP oraz poziom poufności aplikacji.
To już krok 3, a ostatni krok został zakończony przez otwarcie Cloud Shell w folderze iap-codelab/2-HelloUser
. Zmień folder, aby wykonać ten krok:
cd ~/iap-codelab/3-HelloVerifiedUser
Wdrażanie w App Engine
Wdróż aplikację w standardowym środowisku App Engine języka Python 3.7:
gcloud app deploy
Na pytanie, czy chcesz kontynuować, wpisz Y, aby potwierdzić. Aplikacja powinna zostać wdrożona w ciągu kilku minut. Czekając na zakończenie tego procesu, możesz przejrzeć pliki aplikacji w opisany poniżej sposób.
Gdy wdrożenie będzie gotowe, pojawi się komunikat informujący o tym, że można wyświetlić aplikację przy użyciu gcloud app browse
. Wpisz polecenie. Jeśli w przeglądarce nie otworzy się nowa karta, skopiuj wyświetlony link i otwórz go w nowej karcie, tak jak robisz to zwykle.
Pamiętaj, że IAP został wyłączony w kroku 2, więc aplikacja nie podaje żadnych danych IAP. Efekt będzie podobny do tego:
Podobnie jak poprzednio aktywowanie nowej wersji aplikacji i wyświetlenie zaktualizowanej strony może potrwać kilka minut.
Ponieważ IAP jest wyłączony, nie są dostępne żadne informacje o użytkowniku. Teraz ponownie włącz IAP.
W oknie Cloud Console kliknij ikonę menu w lewym górnym rogu strony i wybierz Zabezpieczenia. Kliknij przełącznik IAP obok aplikacji App Engine, aby ponownie włączyć IAP. |
Odśwież stronę. Powinna pojawić się strona podobna do następującej:
Pamiętaj, że adres e-mail podany przez zweryfikowane metodę nie ma prefiksu accounts.google.com:
.
Po wyłączeniu lub pominięciu IAP zweryfikowane dane nie będą dostępne albo będą nieprawidłowe, ponieważ odpowiedni podpis mogą mieć wyłącznie dane utworzone przez posiadacza kluczy prywatnych Google.
Sprawdzanie plików aplikacji
Ten folder zawiera ten sam zestaw plików, co w kroku 2. Zmieniły się 2 pliki i 1 nowy. Nowy plik to auth.py
, który stanowi metodę user()
służącą do pobierania i weryfikowania kryptograficznie podpisanych informacji o tożsamości. Zmienione pliki to main.py
i templates/index.html
, które wykorzystują wyniki wybranej metody. Wyświetlane są również niezweryfikowane nagłówki wymienione w kroku 2.
Głównie nowa funkcja 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
to kryptograficznie podpisane dane, które zostały podane w określonym nagłówku żądania. W kodzie używana jest biblioteka, która weryfikuje i dekoduje dane. Proces weryfikacji używa dostarczonych przez Google kluczy publicznych do sprawdzania podpisywanych danych i uzyskiwania informacji o odbiorcach, dla których zostały one przygotowane (czyli o chronionym projekcie Google Cloud). Funkcje pomocnicze keys()
i audience()
zbierają i zwracają wartości.
Podpisany obiekt zawiera 2 rodzaje danych: zweryfikowany adres e-mail i unikalną wartość identyfikatora (w polu sub
w przypadku pola standardowego dla subskrybenta).
W ten sposób zakończyliśmy wykonywanie kroku 3.
Aplikacja internetowa App Engine została wdrożona. W kroku 1 ograniczyliśmy dostęp do aplikacji tylko do wybranych użytkowników. W ramach kroku 2 pobrałeś i wyświetliłeś informacje o tożsamościach użytkowników, którym zezwalano na dostęp do aplikacji za pomocą IAP. W kroku 3 zweryfikowano kryptograficznie podpisane potwierdzenia tożsamości użytkownika, których nie można sfałszować.
Jedynymi zasobami Google Cloud Platform używanymi w tym ćwiczeniu z programowania są instancje App Engine. Za każdym razem, gdy wdrażasz aplikację, tworzona jest jej nowa wersja, która pozostaje dostępna do czasu jej usunięcia. Opuść moduł, aby usunąć projekt i wszystkie znajdujące się w nim zasoby.