Bu codelab hakkında
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, uygulamaya erişimi kısıtlama ve IAP'den kullanıcı kimliği alma konularında size yol göstereceğiz.
Oluşturacağınız nedir?
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 düzeyde bilgi
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 kullanımınıza sunulmuştur.
2. Kurulum
Cloud Shell komut satırı ortamında çalışacaksınız. Söz konusu ortamı açıp örnek kodu oraya getirerek başlayın.
Console'u ve Cloud Shell'i başlatma
Laboratuvar sayfasının sol üst bölümündeki 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şturulan ve açılan proje için bir Cloud Shell iç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ı komutları girmenize ve çalıştırmanıza olanak tanır.Komutlar kendi bilgisayarınızdan çalıştırılabilir, ancak önce gerekli geliştirme yazılımını yüklemeniz ve yapılandırmanız gerekir. Cloud Shell'de ihtiyacınız olan tüm yazılım araçları 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" ifadesini görüntüleyen bir App Engine Standard uygulamasıdır karşılama sayfası. 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ın kodunu içeren 1-HelloWorld
alt klasörüne geçin.
cd 1-HelloWorld
Uygulama kodu, main.py
dosyasındadır. Flask web çerçevesini kullanarak web isteklerine bir şablonun içeriğiyle yanıt verir. Şablon dosyası templates/index.html
konumundadır ve bu adım için yalnızca düz 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çıp 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 yapacağınız bölgeyi seçmeniz istenebilir. Yakınınızda bulunan ve "standardı desteklediğini" belirten herhangi bir cihazı seçin. Devam etmek isteyip istemediğiniz sorulduğunda Evet anlamında Y
değerini girin.
Birkaç dakika içinde dağıtım tamamlanacaktır ve uygulamanızı gcloud app browse
ile görüntüleyebileceğinize dair bir mesaj göreceksiniz. O kodu girin. Tarayıcınızda yeni bir sekme açılmıyorsa görüntülenen 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 konsolu penceresinde sayfanın sol üst kısmındaki menü simgesini tıklayın, Güvenlik'i ve ardından Identity-Aware Proxy'yi tıklayın. | |
Bu proje için ilk kez bir kimlik doğrulama seçeneğini etkinleştirdiğiniz için IAP'yi kullanmadan önce OAuth izin ekranınızı yapılandırmanız gerektiğini belirten bir mesaj göreceksiniz. | |
İZİN EKRANINI YAPILANDIR DÜĞMESİNİ tıklayın. İzin 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. önceden doldurulmuş olabilir. |
Yetkilendirilen alan | uygulamanın URL'sinin ana makine adı bölümü, ö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şını |
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ıdır. 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. Şimdi 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öreceksiniz. 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ç ekranı görüntülenir. | |
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 atamak için 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, bazı durumlarda sayfasını ziyaret edin. Bu durumda, şu adımları izleyin:
- Web tarayıcınızda ana sayfa adresini açmak için URL'nin sonuna
/_gcp_iap/clear_login_cookie
ekleyin (ö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şin
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'iniz iap-codelab/1-HelloWorld
klasöründe açılarak sona ermiştir. 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 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 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.
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
'da, 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 harfe duyarlı değildir. Dolayısıyla 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 gibi sağlanan veriler, accounts.google.com
: ile başlar ve 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 konsolu penceresinde sayfanın sol üst kısmındaki menü simgesini tıklayın, Güvenlik'i ve ardından Identity-Aware Proxy'yi tıklayın. App Engine uygulamasının yanındaki IAP açma/kapatma düğmesini tıklayarak IAP'yi kapatı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 durumlar için 3. adımda bir çözüm söz konusudur.
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
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 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'iniz iap-codelab/2-HelloUser
klasöründe açılarak 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 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.
2. Adım'da IAP'yi devre dışı bıraktığınızı, bu nedenle uygulamaya IAP 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 konsolu penceresinde sayfanın sol üst kısmındaki menü simgesini tıklayın, Güvenlik'i ve ardından 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 etkinleştirin. |
Sayfayı yenileyin. Sayfa aşağıdaki gibi görünecektir:
Doğrulanan yöntemle sağlanan e-posta adresinde accounts.google.com:
önekinin 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ım'da görünenlerle aynı dosya setini içerir ancak iki dosya değiştirilmiş ve bir yeni dosya eklenmiştir. Yeni dosya auth.py
ve kriptografik olarak imzalanmış kimlik bilgilerini almak ve doğrulamak için bir user()
yöntemi sağlar. Değiştirilen dosyalar ise main.py
ve templates/index.html
. Bunlar da 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, birincil 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ış 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 onaylamalarını doğruladınız.
7. Temizleme
Bu codelab'de yalnızca App Engine örnekleri kullanmış olursunuz. Uygulamayı her dağıtışınızda yeni bir sürüm oluşturulur ve silinene kadar varlığını sürdürür. Projeyi ve içindeki tüm kaynakları silmek için laboratuvardan çıkın.