1. Giriş
Web uygulamanızın kullanıcılarının kimliklerini doğrulamak çoğunlukla gereklidir ve genellikle uygulamanızda özel programlama gerektirir. Google Cloud Platform uygulamalarında ise bu sorumlulukları Identity-Aware Proxy hizmetine bırakabilirsiniz. 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, erişimi kısıtlama ve IAP'den kullanıcı kimliği alma adımları açıklanmaktadır.
Ne oluşturacaksınız?
Bu codelab'de, Google App Engine ile minimal bir web uygulaması oluşturacak, 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 dili hakkında temel bilgiler
Bu codelab, Google App Engine ve IAP üzerinde odaklanmıştır. Alakalı olmayan kavramlar ve kod blokları işaretlenmiştir ve yalnızca kopyalayıp yapıştırmanız için paylaşılmıştır.
2. Hazırlanma
Cloud Shell komut satırı ortamında çalışacaksınız. Öncelikle bu ortamı açıp örnek kodu getirin.
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 şifreyle giriş yapmanız gerekir. |
|
Bu codelab'deki tüm komutlar, sizin için oluşturulan ve açılan projenin Cloud Shell'inde yürütülür. Konsol sayfası 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ında komutları girip çalıştırabilirsiniz.Komutlar kendi bilgisayarınızdan çalıştırılabilir ancak önce gerekli geliştirme yazılımını yükleyip yapılandırmanız gerekir. Cloud Shell'de ihtiyacınız olan tüm yazılım araçları zaten mevcuttur. |
|
Kodu indirme
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 user-authentication-with-iap
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.
3. 1. adım: Uygulamayı dağıtın ve IAP ile koruyun
Bu, Python 3.7'de yazılmış ve yalnızca "Hello, World" karşılama sayfasını görüntüleyen bir App Engine Standard uygulamasıdır. Uygulamayı dağıtıp test edeceğiz, ardından IAP kullanarak uygulamaya erişimi kısıtlayacağız.
Uygulama kodunu inceleme
Ana proje klasöründen, bu adım için gerekli kodu içeren 1-HelloWorld alt klasörüne geçin.
cd 1-HelloWorld
Uygulama kodu, main.py dosyası içindedir. Flask web çerçevesini kullanarak web isteklerine bir şablonun içeriğiyle yanıt verir. Şablon dosyası templates/index.html içindedir ve bu adım için yalnızca basit HTML içerir. İkinci bir şablon dosyası, templates/privacy.html içinde son derece temel bir örnek gizlilik politikası içerir.
Başka iki dosya da mevcuttur: requirements.txt, uygulamanın kullandığı tüm varsayılan olmayan Python kitaplıklarını listeler; app.yaml ise Google Cloud Platform'a bunun bir Python 3.7 App Engine uygulaması olduğunu bildirir.
Aşağıda gösterildiği şekilde cat komutunu kullanarak kabuktaki her dosyayı listeleyebilirsiniz:
cat main.py
Alternatif olarak, Cloud Shell penceresinin sağ üst tarafındaki 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 Standard ortamına dağıtın.
gcloud app deploy
Dağıtımın yapılacağı bölgeyi seçmeniz istenebilir. Yakınınızda bulunan ve "standardı desteklediği" belirtilen bir bölge seçin. Devam etmek isteyip istemediğiniz sorulduğunda Evet anlamında Y tuşuna basın.
Dağıtım birkaç dakika içinde tamamlanacaktır. Ardından, uygulamanızı gcloud app browse ile görüntüleyebileceğinize dair bir mesaj görürsünüz. O kodu girin. Tarayıcınızda yeni bir sekme açılmıyorsa bağlantıyı tıklayarak yeni bir sekmede açın veya gerekirse kendiniz yeni bir sekme açarak bağlantıyı açtığınız 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 Identity-Aware Proxy'yi tıklayın. |
|
Bu proje için ilk kez bir kimlik doğrulama seçeneğini etkinleştirdiğinizden, UİSA kullanabilmek için OAuth kullanıcı rızası ekranınızı yapılandırmanız gerektiğini belirten bir mesaj görürsünüz. |
|
İZİN EKRANINI YAPILANDIR düğmesini tıklayın. Kullanıcı rızası ekranını yapılandırmak için yeni bir sekme açılır. |
|
Gerekli alanlara uygun değerleri girin:
Uygulama adı | IAP örneği |
Destek e-posta adresi | E-posta adresiniz. Otomatik olarak doldurulmuş olabilir. |
Yetkilendirilen alan | Uygulamanın URL'sinin ana makine adı kısmı, ör. iap-example-999999.appspot.com. Bunu daha önce açmış olduğunuz Hello World web sayfasının adres çubuğunda görebilirsiniz. Söz konusu URL'nin başındaki |
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 sayfa bağlantısının sonuna /privacy eklenerek elde edilir |
Kaydet'i tıklayın. Kimlik bilgileri oluşturmanız istenecektir. Bu codelab için kimlik bilgileri oluşturmanız gerekmez, bu nedenle bu tarayıcı sekmesini kapatabilirsiniz.
Identity-Aware Proxy sayfasına geri dönün ve sayfayı yenileyin. Bu noktada, koruyabileceğiniz kaynakların bir listesini göreceksiniz.IAP'yi etkinleştirmek için App Engine uygulama satırında bulunan IAP sütunundaki açma/kapatma düğmesini tıklayın. |
|
IAP tarafından korunacak alan adlarını görürsünüz. AÇ'ı 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ç" ekranı gösterilir. |
|
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 Cloud IAP/IAP Güvenli Web Uygulaması Kullanıcısı rolünü seçerek rolü bu adrese atayın. 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 yeniden kontrol etmeyebileceğinden "Erişiminiz yok" sayfasını görmeye devam edebilirsiniz. Bu durumda, şu adımları izleyin:
- Web tarayıcınızı açıp URL'nin sonuna
/_gcp_iap/clear_login_cookieeklenmiş ana sayfa adresine gidin (ö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.
4. 2. adım: Kullanıcı kimlik bilgilerine erişme
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, Cloud Shell'inizin iap-codelab/1-HelloWorld klasöründe açılmasıyla sona ermiştir. Bu adım için şu klasöre geçiş yapın:
cd ~/iap-codelab/2-HelloUser
App Engine'e dağıtma
Dağıtım birkaç dakika süreceğinden, uygulamayı Python 3.7 için App Engine Standard ortamına dağıtarak başlayın:
gcloud app deploy
Devam etmek isteyip istemediğiniz sorulduğunda Evet anlamında Y tuşuna basın. 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ğinize dair bir mesaj alacaksı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.
Uygulama dosyalarını inceleme
Bu klasör, 1. adımda görünenlerle aynı dosya setini içerir, ancak dosyalardan ikisi değiştirilmiştir: 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 şablonda artık bu veriler bulunmaktadır.
main.py içinde, IAP tarafından sağlanan kimlik verilerini alan iki satır bulunur:
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 harflere duyarlı değildir; yani tercihe bağlı olarak tamamı küçük veya büyük harflerle girilebilir. 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 üzere sağlanan veriler, accounts.google.com: ile başlar, bu da bilginin 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 Identity-Aware Proxy'yi tıklayın. IAP'yi devre dışı bırakmak için App Engine uygulamasının yanındaki IAP açma/kapatma düğmesini 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> kodunu, uygulamanız için doğru olan 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ülenecek ve aşağıdaki gibi görünecektir:
<!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ımda bir çözüm gösterilir.
5. 3. adım: Kriptografik doğrulamayı kullanın
IAP'nin kapatılma veya atlanma riski söz konusuysa uygulamanız, aldığı kimlik bilgilerinin geçerli olup olmadığını kontrol edebilir. Bu, IAP tarafından eklenen, X-Goog-IAP-JWT-Assertion şeklinde üçü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 devre dışı bırakı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 son adım, Cloud Shell'inizin iap-codelab/2-HelloUser klasöründe açılmasıyla sona ermiştir. 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 Standard ortamına dağıtın:
gcloud app deploy
Devam etmek isteyip istemediğiniz sorulduğunda Evet anlamında Y tuşuna basın. 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ğinize dair bir mesaj alacaksı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.
2. adımda UİSA'yı devre dışı bıraktığınızı, bu nedenle uygulamaya UİSA verisi sağlanmadığını 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 etkinleştirin.
Cloud Console penceresinde, sayfanın sol üst kısmındaki menü simgesini, ardından Güvenlik'i ve Identity-Aware Proxy'yi tıklayın. App Engine uygulamasının yanındaki IAP açma/kapatma düğmesini tıklayarak IAP'yi yeniden açın. |
|
Sayfayı yenileyin. Sayfa aşağıdaki gibi görünecektir:

Doğrulanan yöntemle sağlanan e-posta adresinde accounts.google.com: ön ekinin bulunmadığına dikkat edin.
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.
Uygulama dosyalarını inceleme
Bu klasör, 2. adımda görünenlerle aynı dosya setini içerir, ancak iki dosya değiştirilmiş ve bir yeni dosya eklenmiştir. Yeni dosya auth.py'dir ve kriptografik olarak imzalanmış kimlik bilgilerini almak ve doğrulamak için bir user() yöntemi sağlar. Değiştirilmiş dosyalar ise main.py ve templates/index.html'dir. Bu dosyalar artık söz konusu yöntemin sonuçlarını kullanır. 2. adımda bulunan doğrulanmamış başlıklar da karşılaştırma amacıyla gösterilir.
Yeni işlev, birincil olarak user() işlevi içindedir:
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ış veridir. 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 içinde sağlanmış, standart alan).
Böylece 3. adım tamamlanmış olur.
6. Özet
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şim izni verdiği kullanıcıların kimliklerini aldınız ve görüntülediniz, ayrıca IAP'nin devre dışı bırakılması veya atlanması durumunda bu bilgilerde nasıl adres sahteciliği yapılabileceğini gördünüz. 3. adımda, kullanıcı kimliğinin kriptografik olarak imzalanmış, adres sahteciliği için kullanılması mümkün olmayan onaylarını doğruladınız.
7. Temizleme
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 bu sürüm, silinene kadar varlığını sürdürür. Projeyi ve içindeki tüm kaynakları silmek için laboratuvardan çıkın.











