การตรวจสอบสิทธิ์ผู้ใช้ด้วย Identity-Aware Proxy

1. บทนำ

การตรวจสอบสิทธิ์ผู้ใช้เว็บแอปมักเป็นสิ่งจำเป็น และโดยปกติแล้วจะต้องมีการเขียนโปรแกรมพิเศษในแอป สำหรับแอป Google Cloud Platform คุณสามารถมอบความรับผิดชอบเหล่านั้นให้กับบริการ Identity-Aware Proxy ได้ หากคุณต้องการจำกัดการเข้าถึงเฉพาะผู้ใช้ที่เลือก ก็ไม่จำเป็นต้องทำการเปลี่ยนแปลงใดๆ กับแอปพลิเคชัน หากแอปพลิเคชันจำเป็นต้องทราบตัวตนของผู้ใช้ (เช่น เพื่อเก็บค่ากำหนดของผู้ใช้ไว้ฝั่งเซิร์ฟเวอร์) Identity-Aware Proxy จะให้ข้อมูลดังกล่าวได้โดยใช้โค้ดของแอปพลิเคชันน้อยที่สุด

Identity-Aware Proxy คืออะไร

Identity-Aware Proxy (IAP) เป็นบริการของ Google Cloud Platform ที่สกัดกั้นคำขอเว็บที่ส่งไปยังแอปพลิเคชันของคุณ ตรวจสอบสิทธิ์ผู้ใช้ที่ส่งคำขอโดยใช้บริการข้อมูลประจำตัวของ Google และอนุญาตให้คำขอผ่านได้ก็ต่อเมื่อมาจากผู้ใช้ที่คุณให้สิทธิ์เท่านั้น นอกจากนี้ ยังสามารถแก้ไขส่วนหัวของคำขอให้มีข้อมูลเกี่ยวกับผู้ใช้ที่ผ่านการตรวจสอบสิทธิ์ได้ด้วย

Codelab นี้จะแนะนำขั้นตอนการสร้างแอปพลิเคชันของคุณเอง การจำกัดการเข้าถึง และการรับข้อมูลประจำตัวผู้ใช้จาก IAP

สิ่งที่คุณจะสร้าง

ใน Codelab นี้ คุณจะได้สร้างเว็บแอปพลิเคชันขั้นต่ำด้วย Google App Engine จากนั้นสำรวจวิธีต่างๆ ในการใช้ Identity-Aware Proxy เพื่อจำกัดการเข้าถึงแอปพลิเคชันและให้ข้อมูลระบุตัวตนของผู้ใช้แก่แอปพลิเคชัน แอปของคุณจะทำสิ่งต่อไปนี้

  • แสดงหน้าต้อนรับ
  • เข้าถึงข้อมูลระบุตัวตนของผู้ใช้ที่ IAP ระบุ
  • ใช้การยืนยันด้วยการเข้ารหัสเพื่อป้องกันการปลอมแปลงข้อมูลระบุตัวตนของผู้ใช้

สิ่งที่คุณจะได้เรียนรู้

  • วิธีเขียนและทำให้แอป App Engine อย่างง่ายใช้งานได้โดยใช้ Python 3.7
  • วิธีเปิดและปิดใช้ IAP เพื่อจำกัดการเข้าถึงแอป
  • วิธีรับข้อมูลระบุตัวตนของผู้ใช้จาก IAP ไปยังแอป
  • วิธียืนยันข้อมูลจากการซื้อในแอปด้วยการเข้ารหัสเพื่อป้องกันการปลอมแปลง

สิ่งที่คุณต้องมี

  • เว็บเบราว์เซอร์รุ่นใหม่ เช่น Chrome
  • มีความรู้พื้นฐานเกี่ยวกับภาษาโปรแกรม Python

Codelab นี้มุ่งเน้นที่ Google App Engine และ IAP เราจะข้ามแนวคิดและบล็อกโค้ดที่ไม่เกี่ยวข้องไป และจะให้คุณคัดลอกและวางได้ง่ายๆ

2. การเริ่มตั้งค่า

คุณจะทำงานในสภาพแวดล้อมบรรทัดคำสั่งของ Cloud Shell เริ่มต้นด้วยการเปิดสภาพแวดล้อมนั้นและดึงข้อมูลโค้ดตัวอย่างไปยังสภาพแวดล้อม

เปิด Console และ Cloud Shell

ที่ด้านซ้ายบนของหน้าแล็บ ให้คลิกปุ่มเปิด Google Console คุณจะต้องเข้าสู่ระบบด้วยชื่อผู้ใช้และรหัสผ่านที่แสดงใต้ปุ่มนั้น

คำสั่งทั้งหมดใน Codelab นี้จะดำเนินการภายใน Cloud Shell สำหรับโปรเจ็กต์ที่สร้างและเปิดให้คุณ เปิด Cloud Shell โดยคลิกไอคอนเปิดใช้งาน Cloud Shell ที่ด้านขวาของส่วนหัวของหน้าคอนโซล ส่วนครึ่งล่างของหน้าเว็บจะช่วยให้คุณป้อนและเรียกใช้คำสั่งได้ โดยคุณสามารถเรียกใช้คำสั่งจากพีซีของคุณเองได้ แต่จะต้องติดตั้งและกำหนดค่าซอฟต์แวร์การพัฒนาที่จำเป็นก่อน Cloud Shell มีเครื่องมือซอฟต์แวร์ทั้งหมดที่คุณต้องการอยู่แล้ว

ดาวน์โหลดโค้ด

คลิกพื้นที่บรรทัดคำสั่งใน Cloud Shell เพื่อให้คุณพิมพ์คำสั่งได้ ดึงข้อมูลโค้ดจาก Github แล้วเปลี่ยนไปที่โฟลเดอร์โค้ด

git clone https://github.com/googlecodelabs/user-authentication-with-iap.git
cd user-authentication-with-iap

โฟลเดอร์นี้มีโฟลเดอร์ย่อย 1 โฟลเดอร์สำหรับแต่ละขั้นตอนของ Codelab นี้ คุณจะเปลี่ยนไปที่โฟลเดอร์ที่ถูกต้องเพื่อทำแต่ละขั้นตอน

3. ขั้นตอนที่ 1 - ทำให้แอปพลิเคชันใช้งานได้และปกป้องด้วย IAP

นี่คือแอปพลิเคชัน App Engine มาตรฐานที่เขียนด้วย Python 3.7 ซึ่งแสดงหน้าต้อนรับ "Hello, World" อย่างง่าย เราจะทำให้ใช้งานได้และทดสอบ จากนั้นจำกัดการเข้าถึงโดยใช้ IAP

ตรวจสอบโค้ดของแอปพลิเคชัน

เปลี่ยนจากโฟลเดอร์โปรเจ็กต์หลักไปยังโฟลเดอร์ย่อย 1-HelloWorld ที่มีโค้ดสำหรับขั้นตอนนี้

cd 1-HelloWorld

โค้ดของแอปพลิเคชันอยู่ในไฟล์ main.py โดยจะใช้เฟรมเวิร์กเว็บ Flask เพื่อตอบสนองต่อคำขอเว็บด้วยเนื้อหาของเทมเพลต ไฟล์เทมเพลตดังกล่าวอยู่ใน templates/index.html และสำหรับขั้นตอนนี้จะมีเฉพาะ HTML ธรรมดา ไฟล์เทมเพลตที่ 2 มีตัวอย่างโครงร่างนโยบายความเป็นส่วนตัวใน templates/privacy.html

นอกจากนี้ยังมีไฟล์อื่นๆ อีก 2 ไฟล์ ได้แก่ requirements.txt ซึ่งแสดงรายการไลบรารี Python ทั้งหมดที่ไม่ใช่ค่าเริ่มต้นที่แอปพลิเคชันใช้ และ app.yaml ซึ่งแจ้งให้ Google Cloud Platform ทราบว่านี่คือแอปพลิเคชัน App Engine ของ Python 3.7

คุณสามารถแสดงรายการแต่ละไฟล์ใน Shell ได้โดยใช้คำสั่ง cat ดังนี้

cat main.py

หรือจะเปิดเครื่องมือแก้ไขโค้ดของ Cloud Shell โดยคลิกไอคอนดินสอที่ด้านขวาบนของหน้าต่าง Cloud Shell แล้วตรวจสอบโค้ดด้วยวิธีนั้นก็ได้

คุณไม่จำเป็นต้องเปลี่ยนแปลงไฟล์ใดๆ สำหรับขั้นตอนนี้

ทำให้ใช้งานได้กับ App Engine

ตอนนี้ให้ทำให้แอปใช้งานได้ในสภาพแวดล้อมมาตรฐานของ App Engine สำหรับ Python 3.7

gcloud app deploy

ระบบอาจขอให้คุณเลือกภูมิภาคที่จะทำให้ใช้งานได้ เลือกเครื่องใดก็ได้ที่อยู่ใกล้คุณซึ่งระบุว่า "รองรับมาตรฐาน" เมื่อระบบถามว่าคุณต้องการดำเนินการต่อไหม ให้ป้อน Y เพื่อตอบว่าใช่

การทำให้ใช้งานได้จะเสร็จสมบูรณ์ในอีกไม่กี่นาที และคุณจะเห็นข้อความที่ระบุว่าคุณดูแอปพลิเคชันได้ด้วย gcloud app browse ป้อนคำสั่งนั้น หากเบราว์เซอร์ไม่เปิดแท็บใหม่ ให้คลิกลิงก์ที่แสดงเพื่อเปิดในแท็บใหม่ หรือคัดลอกไปยังแท็บใหม่ที่เปิดด้วยตนเองหากจำเป็น เนื่องจากนี่เป็นครั้งแรกที่แอปนี้ทำงาน ระบบจึงใช้เวลา 2-3 วินาทีในการแสดงแอปขณะที่อินสแตนซ์ระบบคลาวด์เริ่มต้น และคุณควรเห็นหน้าต่างต่อไปนี้

1c1c0b166c6023e.png

คุณสามารถเปิด URL เดียวกันนั้นจากคอมพิวเตอร์เครื่องใดก็ได้ที่เชื่อมต่ออินเทอร์เน็ตเพื่อดูหน้าเว็บดังกล่าว ยังไม่มีการจำกัดการเข้าถึง

จำกัดการเข้าถึงด้วย IAP

ในหน้าต่างคอนโซลระบบคลาวด์ ให้คลิกไอคอนเมนูที่ด้านซ้ายบนของหน้า จากนั้นคลิกความปลอดภัย แล้วคลิก Identity-Aware Proxy

เนื่องจากนี่เป็นครั้งแรกที่คุณเปิดใช้ตัวเลือกการตรวจสอบสิทธิ์สำหรับโปรเจ็กต์นี้ คุณจะเห็นข้อความที่ระบุว่าคุณต้องกำหนดค่าหน้าจอขอความยินยอม OAuth ก่อนจึงจะใช้ IAP ได้

คลิกปุ่มกำหนดค่าหน้าจอขอความยินยอม แท็บใหม่จะเปิดขึ้นเพื่อกำหนดค่าหน้าจอขอความยินยอม

กรอกข้อมูลในช่องว่างที่ต้องกรอกด้วยค่าที่เหมาะสม

ชื่อแอปพลิเคชัน

ตัวอย่าง IAP

อีเมลทีมสนับสนุน

อีเมลของคุณ ระบบอาจกรอกข้อมูลให้คุณแล้ว

โดเมนที่ได้รับอนุญาต

ส่วนชื่อโฮสต์ของ URL ของแอปพลิเคชัน เช่น iap-example-999999.appspot.com คุณดูส่วนนี้ได้ในแถบที่อยู่ของหน้าเว็บ Hello World ที่คุณเปิดก่อนหน้านี้ อย่าใส่ https://เริ่มต้นหรือ/ต่อท้ายจาก URL นั้นคุณต้องกด Enter หลังจากป้อนค่านี้

ลิงก์หน้าแรกของแอปพลิเคชัน

URL ที่คุณใช้เพื่อดูแอป

ลิงก์นโยบายความเป็นส่วนตัวของแอปพลิเคชัน

ลิงก์หน้าความเป็นส่วนตัวในแอป ซึ่งเหมือนกับลิงก์หน้าแรกที่มี /privacy เพิ่มที่ท้าย

คลิกบันทึก ระบบจะแจ้งให้คุณสร้างข้อมูลเข้าสู่ระบบ คุณไม่จำเป็นต้องสร้างข้อมูลเข้าสู่ระบบสำหรับ Codelab นี้ เพียงปิดแท็บเบราว์เซอร์นี้

กลับไปที่หน้า Identity-Aware Proxy แล้วรีเฟรช ตอนนี้คุณควรเห็นรายการทรัพยากรที่ปกป้องได้แล้ว คลิกปุ่มเปิด/ปิดในคอลัมน์ IAP ในแถวแอป App Engine เพื่อเปิด IAP

คุณจะเห็นชื่อโดเมนที่จะได้รับการปกป้องโดย IAP คลิกเปิด

ตอนนี้ให้เปิดแท็บเบราว์เซอร์แล้วไปที่ URL ของแอป คุณจะเห็นหน้าจอ "ลงชื่อเข้าใช้ด้วย Google" ซึ่งกำหนดให้คุณต้องเข้าสู่ระบบเพื่อเข้าถึงแอป

ลงชื่อเข้าใช้ด้วยบัญชี Google หรือ G Suite คุณจะเห็นหน้าจอที่ปฏิเสธการเข้าถึง

คุณปกป้องแอปด้วย IAP เรียบร้อยแล้ว แต่ยังไม่ได้แจ้งให้ IAP ทราบว่าควรอนุญาตบัญชีใด

กลับไปที่หน้า Identity-Aware Proxy ของคอนโซล เลือกช่องทําเครื่องหมายข้างแอป App Engine แล้วดูแถบด้านข้างทางด้านขวาของหน้า

คุณต้องเพิ่มอีเมลแต่ละรายการ (หรืออีเมลของ Google Group หรือชื่อโดเมน G Suite) ที่ควรได้รับอนุญาตให้เข้าถึงเป็นสมาชิก คลิกเพิ่มสมาชิก ป้อนอีเมล จากนั้นเลือกบทบาทผู้ใช้ Cloud IAP/เว็บแอปที่รักษาความปลอดภัยด้วย IAP เพื่อมอบหมายให้กับอีเมลนั้น คุณป้อนอีเมลหรือโดเมน G Suite เพิ่มเติมได้ในลักษณะเดียวกัน

คลิก "บันทึก" ข้อความ "อัปเดตนโยบายแล้ว" จะปรากฏที่ด้านล่างของหน้าต่าง

กลับไปที่แอปแล้วโหลดหน้าเว็บซ้ำ ตอนนี้คุณควรเห็นเว็บแอปเนื่องจากคุณได้เข้าสู่ระบบด้วยผู้ใช้ที่คุณให้สิทธิ์แล้ว อย่างไรก็ตาม คุณอาจยังเห็นหน้า "คุณไม่มีสิทธิ์เข้าถึง" เนื่องจาก IAP อาจไม่ตรวจสอบการให้สิทธิ์ของคุณอีกครั้ง ในกรณีนี้ ให้ทำตามขั้นตอนต่อไปนี้

  • เปิดเว็บเบราว์เซอร์ไปยังที่อยู่หน้าแรกโดยเพิ่ม /_gcp_iap/clear_login_cookie ที่ท้าย URL ดังเช่น https://iap-example-999999.appspot.com/_gcp_iap/clear_login_cookie
  • คุณจะเห็นหน้าจอลงชื่อเข้าใช้ด้วย Google ใหม่พร้อมบัญชีของคุณที่แสดงอยู่แล้ว อย่าคลิกบัญชี แต่ให้คลิก "ใช้บัญชีอื่น" แล้วป้อนข้อมูลเข้าสู่ระบบอีกครั้ง
  • ขั้นตอนเหล่านี้จะทำให้ IAP ตรวจสอบสิทธิ์เข้าถึงอีกครั้ง และตอนนี้คุณควรเห็นหน้าจอหลักของแอปพลิเคชันแล้ว

หากคุณมีสิทธิ์เข้าถึงเบราว์เซอร์อื่นหรือใช้โหมดไม่ระบุตัวตนในเบราว์เซอร์ได้ และมีบัญชี Gmail หรือ G Suite อื่นที่ใช้งานได้ คุณสามารถใช้เบราว์เซอร์นั้นเพื่อไปยังหน้าแอปและเข้าสู่ระบบด้วยบัญชีอื่นได้ เนื่องจากบัญชีดังกล่าวไม่ได้รับอนุญาต จึงจะเห็นหน้าจอ "คุณไม่มีสิทธิ์เข้าถึง" แทนแอปของคุณ

4. ขั้นตอนที่ 2 - เข้าถึงข้อมูลระบุตัวตนของผู้ใช้

เมื่อแอปได้รับการปกป้องด้วย IAP แล้ว แอปจะใช้ข้อมูลประจำตัวที่ IAP ให้ไว้ในส่วนหัวของคำขอเว็บที่ส่งผ่านได้ ในขั้นตอนนี้ แอปพลิเคชันจะได้รับอีเมลของผู้ใช้ที่เข้าสู่ระบบและรหัสผู้ใช้ที่ไม่ซ้ำกันแบบถาวรซึ่งบริการข้อมูลประจำตัวของ Google มอบหมายให้กับผู้ใช้รายนั้น ระบบจะแสดงข้อมูลดังกล่าวต่อผู้ใช้ในหน้าต้อนรับ

นี่คือขั้นตอนที่ 2 และขั้นตอนสุดท้ายสิ้นสุดด้วยการเปิด Cloud Shell ในโฟลเดอร์ iap-codelab/1-HelloWorld เปลี่ยนเป็นโฟลเดอร์สำหรับขั้นตอนนี้

cd ~/iap-codelab/2-HelloUser

ทำให้ใช้งานได้กับ App Engine

เนื่องจากการทำให้ใช้งานได้จะใช้เวลา 2-3 นาที ให้เริ่มด้วยการทำให้แอปใช้งานได้ในสภาพแวดล้อมมาตรฐานของ App Engine สำหรับ Python 3.7 ดังนี้

gcloud app deploy

เมื่อระบบถามว่าคุณต้องการดำเนินการต่อไหม ให้ป้อน Y เพื่อตอบว่าใช่ การติดตั้งใช้งานจะเสร็จสมบูรณ์ในอีกไม่กี่นาที ขณะรอ คุณสามารถตรวจสอบไฟล์แอปพลิเคชันได้ตามที่อธิบายไว้ด้านล่าง

เมื่อการติดตั้งใช้งานพร้อมแล้ว คุณจะเห็นข้อความที่ระบุว่าคุณดูแอปพลิเคชันได้ด้วย gcloud app browse ป้อนคำสั่งนั้น หากแท็บใหม่ไม่เปิดขึ้นในเบราว์เซอร์ ให้คัดลอกลิงก์ที่แสดงแล้วเปิดในแท็บใหม่ตามปกติ คุณควรเห็นหน้าเว็บที่คล้ายกับหน้าเว็บต่อไปนี้

5b5fb03111258cec.png

คุณอาจต้องรอสักครู่เพื่อให้แอปพลิเคชันเวอร์ชันใหม่แทนที่เวอร์ชันก่อนหน้า รีเฟรชหน้าเว็บหากจำเป็นเพื่อดูหน้าเว็บที่คล้ายกับด้านบน

ตรวจสอบไฟล์แอปพลิเคชัน

โฟลเดอร์นี้มีชุดไฟล์เดียวกันกับที่เห็นในขั้นตอนที่ 1 แต่มีการเปลี่ยนแปลงไฟล์ 2 ไฟล์ ได้แก่ main.py และ templates/index.html เราได้เปลี่ยนแปลงโปรแกรมเพื่อดึงข้อมูลผู้ใช้ที่ IAP ระบุในส่วนหัวของคำขอ และตอนนี้เทมเพลตจะแสดงข้อมูลดังกล่าว

มี 2 บรรทัดใน 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: ซึ่งแสดงแหล่งที่มาของข้อมูล แอปพลิเคชันของคุณสามารถนำทุกอย่างออกได้จนถึงและรวมถึงเครื่องหมายโคลอนเพื่อรับค่าดิบหากต้องการ

ปิด IAP

จะเกิดอะไรขึ้นกับแอปนี้หากปิดใช้ IAP หรือมีการข้าม IAP (เช่น โดยแอปพลิเคชันอื่นๆ ที่ทำงานในโปรเจ็กต์ที่อยู่ในระบบคลาวด์เดียวกัน) ปิด IAP เพื่อดู

ในหน้าต่างคอนโซลระบบคลาวด์ ให้คลิกไอคอนเมนูที่ด้านซ้ายบนของหน้า จากนั้นคลิกความปลอดภัย แล้วคลิก Identity-Aware Proxy คลิกสวิตช์เปิด/ปิด IAP ข้างแอป App Engine เพื่อปิด IAP

ระบบจะแจ้งเตือนว่าการดำเนินการนี้จะอนุญาตให้ผู้ใช้ทุกคนเข้าถึงแอปได้

รีเฟรชหน้าเว็บของแอปพลิเคชัน คุณควรเห็นหน้าเว็บเดียวกัน แต่ไม่มีข้อมูลผู้ใช้

17c850de95fea839.png

เนื่องจากตอนนี้แอปพลิเคชันไม่มีการป้องกัน ผู้ใช้จึงสามารถส่งคำขอเว็บที่ดูเหมือนว่าผ่าน 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 จะแสดงวิธีแก้ไข

5. ขั้นตอนที่ 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 คุณควรเห็นหน้าเว็บที่คล้ายกับหน้าเว็บต่อไปนี้

8ef2abcc23d96958.png

เช่นเดียวกับก่อนหน้านี้ คุณอาจต้องรอสักครู่เพื่อให้เวอร์ชันล่าสุดพร้อมใช้งานจึงจะเห็นหน้าเวอร์ชันใหม่

เนื่องจากปิดใช้ IAP จึงไม่มีข้อมูลผู้ใช้ ตอนนี้ให้เปิด IAP อีกครั้ง

ในหน้าต่างคอนโซลระบบคลาวด์ ให้คลิกไอคอนเมนูที่ด้านซ้ายบนของหน้า จากนั้นคลิกความปลอดภัย แล้วคลิก Identity-Aware Proxy คลิกสวิตช์สลับ IAP ข้างแอป App Engine เพื่อเปิด IAP อีกครั้ง

รีเฟรชหน้าเว็บ หน้าเว็บควรมีลักษณะดังนี้

3a4d93c11f228852.png

โปรดทราบว่าอีเมลที่ระบุโดยวิธีการที่ยืนยันแล้วจะไม่มีคำนำหน้า accounts.google.com:

หากปิดหรือข้าม IAP ข้อมูลที่ยืนยันแล้วจะขาดหายไปหรือไม่ถูกต้อง เนื่องจากข้อมูลดังกล่าวจะมีลายเซ็นที่ถูกต้องไม่ได้ เว้นแต่จะสร้างโดยผู้ถือคีย์ส่วนตัวของ Google

ตรวจสอบไฟล์แอปพลิเคชัน

โฟลเดอร์นี้มีชุดไฟล์เดียวกันกับที่เห็นในขั้นตอนที่ 2 โดยมีไฟล์ 2 ไฟล์ที่เปลี่ยนแปลงและไฟล์ใหม่ 1 ไฟล์ ไฟล์ใหม่คือ 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 ลงนาม และทราบกลุ่มเป้าหมายที่เตรียมข้อมูลไว้ให้ (โดยพื้นฐานแล้วคือโปรเจ็กต์ที่อยู่ในระบบคลาวด์ Google Cloud ที่ได้รับการปกป้อง) ฟังก์ชันตัวช่วย keys() และ audience() จะรวบรวมและแสดงค่าเหล่านั้น

ออบเจ็กต์ที่ลงนามมีข้อมูล 2 ส่วนที่เราต้องการ ได้แก่ อีเมลที่ยืนยันแล้ว และค่ารหัสที่ไม่ซ้ำกัน (ระบุไว้ใน sub สำหรับฟิลด์มาตรฐานของผู้ติดตาม)

ซึ่งจะเป็นการเสร็จสิ้นขั้นตอนที่ 3

6. สรุป

คุณทำให้เว็บแอปพลิเคชัน App Engine ใช้งานได้ ในขั้นตอนที่ 1 คุณได้จำกัดการเข้าถึงแอปพลิเคชันไว้เฉพาะผู้ใช้ที่คุณเลือก ในขั้นตอนที่ 2 คุณได้ดึงและแสดงข้อมูลประจำตัวของผู้ใช้ที่ IAP อนุญาตให้เข้าถึงแอปพลิเคชันของคุณ และเห็นว่าข้อมูลดังกล่าวอาจถูกปลอมแปลงได้อย่างไรหากปิดใช้หรือข้าม IAP ในขั้นตอนที่ 3 คุณได้ยืนยันการยืนยันตัวตนของผู้ใช้ที่ลงนามแบบเข้ารหัส ซึ่งปลอมแปลงไม่ได้

7. ล้างข้อมูล

ทรัพยากร Google Cloud Platform ที่คุณใช้ใน Codelab นี้คืออินสแตนซ์ App Engine ทุกครั้งที่คุณติดตั้งใช้งานแอป ระบบจะสร้างเวอร์ชันใหม่และจะยังคงมีอยู่จนกว่าจะถูกลบ ออกจาก Lab เพื่อลบโปรเจ็กต์และทรัพยากรทั้งหมดภายใน