Web uygulamanızın kullanıcılarının kimliğinin doğrulanması genellikle gereklidir ve genellikle uygulamanızda özel bir programlama gerektirir. Google Cloud Platform uygulamaları için bu sorumlulukları Identity-Aware Proxy hizmetine aktarabilirsiniz. Yalnızca seçili kullanıcıların erişimini kısıtlamanız gerekiyorsa uygulamada herhangi bir değişiklik yapılmasına gerek yoktur. Uygulamanın, kullanıcı kimliğini bilmesi gerekiyorsa (örneğin kullanıcı tercihlerini sunucu tarafında tutmak için) Identity-Aware Proxy bunu en az miktarda uygulama kodu ile sağlayabilir.
Identity-Aware Proxy nedir?
Identity-Aware Proxy (IAP); uygulamanıza gönderilen web isteklerini karşılayan, Google Kimlik Hizmetini kullanarak istekte bulunan kullanıcıların kimliğini doğrulayan ve yalnızca yetkilendirdiğiniz kullanıcılardan gelen isteklere izin veren bir Google Cloud Platform hizmetidir. Ayrıca istek başlıklarını, kimliği doğrulanmış kullanıcı hakkında bilgi içerecek şekilde değiştirebilir.
Bu codelab'de kendi uygulamanızı oluşturma, uygulamaya erişimi kısıtlama ve UİSA'dan kullanıcı kimliği edinme konusunda size yol göstereceğiz.
Oluşturacağınız uygulama
Bu codelab'de, Google App Engine ile minimal bir web uygulaması derleyecek, ardından uygulamaya erişimi kısıtlamak ve kullanıcı kimliği bilgileri sağlamak için Identity-Aware Proxy'yi kullanmanın çeşitli yollarını keşfedeceksiniz. Uygulamanız şunları yapabilecek:
|
Neler öğreneceksiniz?
- Python 3.7 kullanarak basit bir App Engine uygulaması yazma ve dağıtma
- Uygulamanıza erişimi kısıtlamak için IAP'yi etkinleştirme ve devre dışı bırakma
- Kullanıcı kimliği bilgilerini IAP'den uygulamanıza taşıma
- Adres sahteciliğine karşı koruma sağlamak için IAP'den gelen bilgileri kriptografik olarak doğrulama
Gerekenler
- Chrome gibi modern bir web tarayıcısı.
- Python programlama diliyle ilgili temel bilgiler
Bu codelab, Google App Engine ve UİSA'ya odaklanmaktadır. Alakalı olmayan kavramlar ve kod blokları işaretlenmiştir ve yalnızca kopyalayıp yapıştırmanız için kullanımınıza sunulmuştur.
Cloud Shell komut satırı ortamında çalışacaksınız. Bu ortamı açıp örnek kodu filtreye getirerek başlayın.
Konsol ve Cloud Shell'i başlatma
Laboratuvar sayfasının sol üst kısmında Google Console'u Aç düğmesini tıklayın. Bu düğmenin altında gösterilen Kullanıcı Adı ve Şifre ile giriş yapmanız gerekir. |
Bu codelab'deki tüm komutlar, sizin için oluşturulmuş ve açılmış bir proje için Cloud Shell'de yürütülecektir. Konsol sayfa başlığının sağ tarafında bulunan Cloud Shell'i Etkinleştir simgesini tıklayarak Cloud Shell'i açın. Sayfanın alt yarısı, komutları girmenize ve çalıştırmanıza olanak tanır. Komutlar kendi bilgisayarınızda çalıştırılabilir ancak önce gerekli geliştirme yazılımlarını yükleyip yapılandırmanız gerekir. Cloud Shell, ihtiyacınız olan tüm yazılım araçlarını zaten içerir. |
Kodu indirin
Komut yazabilmek için Cloud Shell'de komut satırı alanını tıklayın. Kodu Github'dan getirin ve ardından şu kod klasörüne geçin:
git clone https://github.com/googlecodelabs/user-authentication-with-iap.git
cd iap-codelab
Bu klasör, bu codelab'in her adımı için bir alt klasör içerir. Her bir adımı gerçekleştirmek üzere doğru klasöre geçeceksiniz.
Bu, Python 3.7'de yazılmış ve yalnızca "Merhaba, Dünya" karşılama sayfasını görüntüleyen bir App Engine Standart uygulamasıdır. Uygulamayı dağıtıp test edeceğiz, ardından IAP kullanarak uygulamaya erişimi kısıtlayacağız.
Başvuru kodunu inceleyin
Ana proje klasöründen, bu adım için kod içeren 1-HelloWorld
alt klasörüne geçin.
cd 1-HelloWorld
Uygulama kodu main.py
dosyasındadır. Web isteklerine bir şablonun içeriğiyle yanıt vermek için Flask web çerçevesini kullanır. Söz konusu şablon dosyası templates/index.html
içindedir ve bu adım için yalnızca düz HTML içerir. İkinci bir şablon dosyası, templates/privacy.html
ürününde taslak örnek bir gizlilik politikası içerir.
Başka iki dosya daha vardır: requirements.txt
, uygulamanın kullandığı varsayılan olmayan tüm Python kitaplıklarını listeler ve app.yaml
Google Cloud Platform'a bunun bir Python 3.7 App Engine uygulaması olduğunu bildirir.
Cat komutunu kullanarak kabuktaki her dosyayı aşağıda gösterildiği şekilde listeleyebilirsiniz:
cat main.py
Alternatif olarak, Cloud Shell penceresinin sağ üst köşesindeki Kalem simgesini tıklayarak Cloud Shell kod düzenleyiciyi açabilir ve kodu bu şekilde inceleyebilirsiniz.
Bu adım için herhangi bir dosyayı değiştirmenize gerek yoktur.
App Engine'e Dağıtım
Şimdi uygulamayı Python 3.7 için App Engine Standart ortamına dağıtın
gcloud app deploy
Dağıtım yapacağınız bölgeyi seçmeniz istenebilir. Yakınınızda bulunan ve "standartı desteklediğini" belirten birini seçin. Devam etmek isteyip istemediğiniz sorulduğunda evet için Y
yazın.
Birkaç dakika içinde dağıtım işlemi tamamlanır. gcloud app browse
ile birlikte uygulamanızı görüntüleyebileceğinizi belirten bir mesaj gösterilir. O kodu girin. Tarayıcınızda yeni bir sekme açılmazsa görünen bağlantıyı yeni bir sekmede açmak için tıklayın veya gerekirse sekmeyi manuel olarak açılan yeni bir sekmeye kopyalayın. Bu uygulama ilk kez çalıştırıldığı için, bir bulut örneği başlatıldığı sırada görüntülenmesi birkaç saniye sürecektir, ardından aşağıdaki pencereyi görmeniz gerekir.
İnternete bağlı herhangi bir bilgisayardan aynı URL'yi açarak o web sayfasını görebilirsiniz. Erişim, henüz kısıtlanmamıştır.
IAP ile erişimi kısıtlama
Cloud Console penceresinde, sayfanın sol üst kısmındaki menü simgesini, ardından Güvenlik'i ve ardından Kimliğe Duyarlı Proxy'yi tıklayın. | |
Bu projede kimlik doğrulama seçeneğini ilk kez etkinleştirdiğinizden, IAP'yi kullanabilmek için önce OAuth izin ekranınızı yapılandırmanız gerektiğini belirten bir mesaj görürsünüz. | |
YAPILANDIRMA EKRANINI YAPILANDIR düğmesi düğmesini tıklayın. Onay ekranını yapılandırmak için yeni bir sekme açılır. |
Gerekli alanlara uygun değerleri girin:
Uygulama adı | UİSA Örneği |
E-postayla destek | e-posta adresinize gönderilir. Sizin için önceden doldurulmuş olabilir. |
Yetkilendirilen alan | uygulamanın URL'sinin ana makine adı kısmı (ör. iap-example-999999.appspot.com.) bunu, daha önce açtığınız Hello World web sayfasının adres çubuğunda görebilirsiniz. Bu URL'nin başındaki Bu değeri girdikten sonra Enter tuşuna basmalısınız. |
Uygulama ana sayfa bağlantısı | uygulamanızı görüntülemek için kullandığınız URL |
Uygulamanın Gizlilik Politikası bağlantısı | uygulamadaki gizlilik sayfası bağlantısı (ana sayfaya /privacy eklenmiş ana sayfa bağlantısı ile aynıdır) |
Kaydet'i tıklayın. Kimlik bilgileri oluşturmanız istenecektir. Bu codelab için kimlik bilgisi oluşturmanız gerekmez. Bu nedenle, bu tarayıcı sekmesini kapatmanız yeterlidir.
Identity-Aware Proxy sayfasına geri dönün ve sayfayı yenileyin. Bu noktada, koruyabileceğiniz kaynakların bir listesini göreceksiniz. UİSA'yı etkinleştirmek için App Engine uygulama satırındaki UİSA sütununda açma/kapatma düğmesini tıklayın. | |
UİSA tarafından korunacak alan adlarını görürsünüz. ETKİNLEŞTİR'i tıklayın. | |
Şimdi bir tarayıcı sekmesi açın ve uygulamanızın URL'sine gidin. Uygulamaya erişmek için giriş yapmanızı gerektiren bir Google ile oturum açma ekranı görürsünüz. | |
Bir Google veya G Suite hesabıyla oturum açın. Erişiminizi reddeden bir ekran ile karşılaşacaksınız. |
Uygulamanızı IAP ile başarıyla korudunuz, ancak hangi hesaplara izin verileceğini IAP'ye henüz bildirmediniz.
Konsolun Identity-Aware Proxy sayfasına dönün, App Engine uygulamasının yanındaki onay kutusunu seçin ve sayfanın sağ tarafındaki kenar çubuğuna bakın. | |
Erişimine izin verilmesi gereken her e-posta adresi (ya da Google Grubu adresi veya G Suite alan adı) Üye olarak eklenmelidir. ÜYE EKLE'yi tıklayın. E-posta adresinizi girin, ardından bu adrese atanacak Cloud IAP/IAP Güvenli Web Uygulaması Kullanıcısı rolünü seçin. Aynı şekilde daha fazla adres veya G Suite alan adı girebilirsiniz. |
Kaydet'i tıklayın. Pencerenin altında "Politika Güncellendi" mesajı görünecektir.
Uygulamanıza geri dönün ve sayfayı yeniden yükleyin. Yetki verdiğiniz kullanıcı bilgileriyle giriş yaptığınız için artık web uygulamanızı görüyor olmanız gerekir. Ancak, IAP yetkilendirmenizi tekrar kontrol edemeyeceğinden "Erişiminiz yok" sayfasını görmeye devam edebilirsiniz. Bu durumda, şu adımları izleyin:
- URL'nin sonuna
/_gcp_iap/clear_login_cookie
ifadesini eklediğiniz şekilde web tarayıcınızı ana sayfa adresine açın (ör.https://iap-example-999999.appspot.com/_gcp_iap/clear_login_cookie
). - Hesabınızın gösterildiği yeni bir "Google ile Oturum Aç" ekranı göreceksiniz. Hesabı tıklamayın. Bunun yerine, "Başka bir hesap kullan" seçeneğini tıklayın ve kimlik bilgilerinizi yeniden girin.
- Bu adımlar, IAP'nin erişiminizi yeniden kontrol etmesini sağlar, ardından da uygulamanızın ana ekranını görmeniz gerekir.
Başka bir tarayıcıya erişiminiz varsa veya tarayıcınızda Gizli Modu kullanabiliyorsanız ve başka bir geçerli Gmail veya G Suite hesabınız varsa, uygulama sayfanıza gitmek ve diğer hesapla giriş yapmak için diğer tarayıcıyı kullanabilirsiniz. Kullandığınız hesap yetkilendirilmediği için uygulamanızı değil "Erişiminiz Yok" ekranını göreceksiniz.
Bir uygulama IAP ile korunduğunda IAP'nin geçirilen web isteği başlıklarında sağladığı kimlik bilgileri kullanılabilir. Bu adımda uygulama, giriş yapan kullanıcının e-posta adresini ve Google Kimlik Hizmeti tarafından o kullanıcıya kalıcı olarak atanan benzersiz kullanıcı kimliğini alacaktır. Bu veriler, karşılama sayfasında kullanıcıya gösterilecektir.
Bu 2. adımdır ve son adımınız Cloud Shell'inizi iap-codelab/1-HelloWorld
klasöründe açarak sona erer. Bu adım için şu klasöre geçiş yapın:
cd ~/iap-codelab/2-HelloUser
App Engine'e Dağıtım
Dağıtım birkaç dakika süreceğinden, uygulamayı Python 3.7 için App Engine Standart ortamına dağıtarak başlayın:
gcloud app deploy
Devam etmek isteyip istemediğiniz sorulduğunda evet için Y girin. Dağıtım, birkaç dakika içinde tamamlanacaktır. Beklerken uygulama dosyalarını aşağıda açıklanan şekilde inceleyebilirsiniz.
Dağıtım hazır olduğunda uygulamanızı gcloud app browse
ile görüntüleyebileceğinizi belirten bir mesaj görürsünüz. O kodu girin. Tarayıcınızda yeni bir sekme açılmıyorsa, görüntülenen bağlantıyı kopyalayın ve normal olarak yeni bir sekmede açın. Aşağıdaki gibi bir sayfa görmeniz gerekir:
Uygulamanızın yeni sürümünün önceki sürümün yerini alması için birkaç dakika beklemeniz gerekebilir. Yukarıdakine benzer bir sayfa görmek için gerekirse sayfayı yenileyin.
Başvuru dosyalarını inceleme
Bu klasörde 1. Adımda gösterilenlerle aynı dosya grubu var, ancak şu iki dosya değiştirildi: main.py
ve templates/index.html
. Program, IAP'nin istek başlıklarında sağladığı kullanıcı bilgilerini alacak şekilde değiştirilmiştir ve şablon artık bu verileri görüntülemektedir.
main.py
'te, UİSA tarafından sağlanan kimlik verilerini alan iki satır vardır:
user_email = request.headers.get('X-Goog-Authenticated-User-Email')
user_id = request.headers.get('X-Goog-Authenticated-User-ID')
X-Goog-Authenticated-User-
başlıkları IAP tarafından sağlanır ve adlar büyük/küçük harfe duyarlı değildir; dolayısıyla, tercihen küçük harfle veya büyük harfle verilebilir. Render_template ifadesi, görüntülenebilmeleri için artık bu değerleri içerir:
page = render_template('index.html', email=user_email, id=user_id)
index.html şablonu, adları çift küme parantezi içine alarak bu değerleri görüntüleyebilir:
Hello, {{ email }}! Your persistent ID is {{ id }}.
Gördüğünüz gibi, sağlanan verilerin önünde accounts.google.com
: öneki, bilgilerin nereden geldiğini gösterir. Uygulamanız, ham değerleri almak için isterseniz iki nokta dahil olmak üzere her şeyi kaldırabilir.
IAP'yi kapatın
IAP devre dışı bırakılırsa veya bir şekilde atlanırsa (örneğin aynı bulut projeniz üzerinde çalışan diğer uygulamalar tarafından) bu uygulamaya ne olur? Görmek için IAP'yi kapatın.
Cloud Console penceresinde, sayfanın sol üst kısmındaki menü simgesini, ardından Güvenlik'i ve ardından Kimliğe Duyarlı Proxy'yi tıklayın. UİSA'yı kapatmak için App Engine uygulamasının yanındaki UİSA açma/kapatma anahtarını tıklayın. |
Bu eylemin, tüm kullanıcıların uygulamaya erişmesine izin vereceğine dair bir uyarı alacaksınız.
Uygulama web sayfasını yenileyin. Herhangi bir kullanıcı bilgisi olmadan, aynı sayfayı görüyor olmanız gerekir:
Uygulama artık korunmuyor olduğundan, bir kullanıcı IAP'den geçmiş gibi görünen bir web isteği gönderebilir. Örneğin, bunu yapmak için Cloud Shell'den aşağıdaki curl komutunu çalıştırabilirsiniz (<your-url-here> kısmını uygulamanız için doğru URL ile değiştirin):
curl -X GET <your-url-here> -H "X-Goog-Authenticated-User-Email: totally fake email"
Web sayfası, komut satırında görüntülenir ve aşağıdaki gibi görünür:
<!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>
Uygulamanın IAP'nin devre dışı bırakıldığını veya atlandığını bilmesi mümkün değildir. Bunun potansiyel bir risk olduğu durumlarda 3. adım bir çözüm gösterir.
IAP'nin kapatılma veya atlanma riski söz konusuysa uygulamanız, aldığı kimlik bilgilerinin geçerli olup olmadığını kontrol edebilir. Bu, UİSA tarafından eklenen ve X-Goog-IAP-JWT-Assertion
adlı üçüncü bir web isteği başlığını kullanır. Başlığın değeri, kullanıcı kimlik verilerini de içeren, kriptografik olarak imzalanmış bir nesnedir. Uygulamanız, dijital imzayı doğrulayabilir ve bu nesnede sağlanan verileri kullanarak bunların herhangi bir değişiklik yapılmadan IAP tarafından sağlandığından emin olabilir.
Dijital imza doğrulaması, en son Google ortak anahtar kümesini almak da dahil olmak üzere birkaç ekstra adım gerektirir. IAP'nin birileri tarafından kapatılması veya atlanması riskini göz önünde bulundurarak ve uygulamanın hassasiyetine bağlı olarak uygulamanızın bu ekstra adımlara ihtiyaç duyup duymadığına karar verebilirsiniz.
Bu 3. adımdır ve Cloud Shell'inizin iap-codelab/2-HelloUser
klasöründe açık olduğu son adım. Bu adım için şu klasöre geçiş yapın:
cd ~/iap-codelab/3-HelloVerifiedUser
App Engine'e Dağıtım
Uygulamayı Python 3.7 için App Engine Standart ortamına dağıtın:
gcloud app deploy
Devam etmek isteyip istemediğiniz sorulduğunda evet için Y girin. Dağıtım, birkaç dakika içinde tamamlanacaktır. Beklerken uygulama dosyalarını aşağıda açıklanan şekilde inceleyebilirsiniz.
Dağıtım hazır olduğunda uygulamanızı gcloud app browse
ile görüntüleyebileceğinizi belirten bir mesaj görürsünüz. O kodu girin. Tarayıcınızda yeni bir sekme açılmıyorsa, görüntülenen bağlantıyı kopyalayın ve normal olarak yeni bir sekmede açın.
IAP'yi 2. adımda devre dışı bıraktığınızı ve bu nedenle uygulamaya UİSA verisi verilmediğini unutmayın. Aşağıdaki gibi bir sayfa görmeniz gerekir:
Daha önce olduğu gibi, sayfanın yeni sürümünü görmek için en yeni sürüm kullanıma girene kadar birkaç dakika beklemeniz gerekebilir.
IAP devre dışı bırakıldığı için kullanıcı bilgisi mevcut değildir. Şimdi IAP'yi tekrar açın.
Cloud Console penceresinde, sayfanın sol üst kısmındaki menü simgesini, ardından Güvenlik'i ve ardından Kimliğe Duyarlı Proxy'yi tıklayın. UİSA'yı tekrar açmak için App Engine uygulamasının yanındaki UİSA açma/kapatma anahtarını tıklayın. |
Sayfayı yenileyin. Sayfa aşağıdaki gibi görünecektir:
Doğrulanmış yöntem tarafından sağlanan e-posta adresinde accounts.google.com:
ön eki yoktur.
IAP'nin kapatılması veya atlanması durumunda, doğrulanan veriler eksik veya geçersiz olur, çünkü Google'ın özel anahtarlarının sahibi tarafından oluşturulmadıkça geçerli bir imzaya sahip olmaları mümkün değildir.
Başvuru dosyalarını inceleme
Bu klasör, 2. Adımda görülenle aynı dosyaları içerir, iki dosya değiştirilmiş ve bir yeni dosya eklenmiştir. Yeni dosya, kriptografik olarak imzalanmış kimlik bilgilerinin alınıp doğrulanması için bir user()
yöntemi sunan auth.py
'dir. Değiştirilen dosyalar artık main.py
ve templates/index.html
. Bu yöntem artık söz konusu yöntemin sonuçlarını kullanıyor. 2. adımda bulunan doğrulanmamış başlıklar da karşılaştırma için gösterilir.
Yeni işlev esas olarak user()
işlevindedir:
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
, belirtilen istek başlığında sağlanan kriptografik olarak imzalanmış verilerdir. Kod, bu veriyi doğrulamak ve kodunu çözmek için bir kitaplıktan yararlanır. Doğrulama işleminde, imzalanan verileri kontrol etmek ve verilerin hangi kitleye yönelik hazırlandığını (esasen korunmakta olan Google Cloud projesi) bilmek için Google'ın sağladığı ortak anahtarlar kullanılır. Yardımcı işlevler keys()
ve audience()
bu değerleri toplar ve döndürür.
İmzalanmış nesnede ihtiyacımız olan iki veri parçası vardır: doğrulanmış e-posta adresi ve benzersiz kimlik değeri (abone için sub
da sağlanmış, standart alan).
Böylece 3. Adım tamamlanmış olur.
Bir App Engine web uygulamasını dağıttınız. 1. Adımda, uygulamaya erişimi yalnızca seçtiğiniz kullanıcılarla sınırlandırdınız. 2. Adımda, IAP'nin uygulamanıza erişmesine izin verdiği kullanıcıların kimliğini alıp görüntülediniz ve UİSA'nın devre dışı bırakılması veya atlanması durumunda bu bilgilerin nasıl taklit edilebileceğini gördünüz. 3. Adımda, kullanıcı kimliğinin kriptografik olarak imzalanmış, adres sahteciliği için kullanılamayacak iddialarını doğruladınız.
Bu codelab'de kullandığınız tek Google Cloud Platform kaynakları App Engine örnekleridir. Uygulamayı her dağıttığınızda yeni bir sürüm oluşturulur ve silinene kadar var olmaya devam eder. Projeyi ve projenin içindeki tüm kaynakları silmek için laboratuvardan çıkın.