การตรวจสอบสิทธิ์ผู้ใช้ด้วย 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 ไปยังแอปของคุณ
  • วิธียืนยันข้อมูลจาก IAP แบบเข้ารหัสเพื่อป้องกันการปลอมแปลง

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

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

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

2. การตั้งค่า

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

เปิดคอนโซลและ Cloud Shell

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

คำสั่งทั้งหมดใน Codelab นี้จะดำเนินการภายใน Cloud Shell สำหรับโปรเจ็กต์ที่สร้างและเปิดให้คุณ เปิด Cloud Shell โดยคลิกไอคอนเปิดใช้งาน Cloud Shell ที่ด้านขวาของส่วนหัวของหน้าคอนโซล ป้อนและเรียกใช้คำสั่งในส่วนครึ่งล่างของหน้าได้ โดยคำสั่งดังกล่าวจะเรียกใช้จาก PC ของคุณเอง แต่คุณต้องติดตั้งและกำหนดค่าซอฟต์แวร์การพัฒนาที่จำเป็นก่อน 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 ว่านี่คือแอปพลิเคชัน Python 3.7 App Engine

คุณแสดงแต่ละไฟล์ในเชลล์ได้โดยใช้คำสั่ง cat ดังตัวอย่างต่อไปนี้

cat main.py

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

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

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

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

gcloud app deploy

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

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

1c1c0b166c6023e.png

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

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

ในหน้าต่าง Cloud Console ให้คลิกไอคอนเมนูที่ด้านซ้ายบนของหน้า แล้วคลิก "ความปลอดภัย" จากนั้นคลิกที่ 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-Secured Web App ที่จะมอบหมายให้อีเมลนั้น คุณอาจป้อนที่อยู่หรือโดเมน 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 Standard สำหรับ Python 3.7 โดยทำดังนี้

gcloud app deploy

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

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

5b5fb03111258cec.png

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

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

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

main.py ที่ได้รับข้อมูลประจำตัวที่ได้จาก IAP มี 2 บรรทัด ดังนี้

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

ในหน้าต่าง Cloud Console ให้คลิกไอคอนเมนูที่ด้านซ้ายบนของหน้า แล้วคลิก "ความปลอดภัย" จากนั้นคลิกที่ 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 อีกครั้ง

ในหน้าต่าง Cloud Console ให้คลิกไอคอนเมนูที่ด้านซ้ายบนของหน้า แล้วคลิก "ความปลอดภัย" จากนั้นคลิกที่ 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 Cloud ที่กำลังได้รับการปกป้อง) ฟังก์ชันตัวช่วย keys() และ audience() จะรวบรวมและแสดงผลค่าเหล่านั้น

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

การดำเนินการนี้จะเสร็จสิ้นขั้นตอนที่ 3

6. สรุป

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

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

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