1. Giới thiệu
Việc xác thực người dùng ứng dụng web thường là cần thiết và thường đòi hỏi phải có chương trình đặc biệt trong ứng dụng của bạn. Đối với các ứng dụng Google Cloud Platform, bạn có thể chuyển những trách nhiệm đó cho dịch vụ Uỷ quyền truy cập dựa trên danh tính. Nếu chỉ cần hạn chế quyền truy cập đối với một số người dùng, bạn không cần thay đổi ứng dụng. Nếu ứng dụng cần biết danh tính của người dùng (chẳng hạn như để lưu giữ các lựa chọn ưu tiên của người dùng ở phía máy chủ), thì Identity-Aware Proxy có thể cung cấp thông tin đó với mã xử lý ứng dụng tối thiểu.
Identity-Aware Proxy là gì?
Identity-Aware Proxy (IAP) là một dịch vụ của Google Cloud Platform, có chức năng chặn các yêu cầu trên web được gửi đến ứng dụng của bạn, xác thực người dùng đưa ra yêu cầu bằng Dịch vụ nhận dạng của Google và chỉ cho phép các yêu cầu đi qua nếu yêu cầu đó đến từ một người dùng mà bạn cho phép. Ngoài ra, nó có thể sửa đổi tiêu đề yêu cầu để thêm thông tin về người dùng đã xác thực.
Lớp học lập trình này sẽ hướng dẫn bạn cách tạo ứng dụng của riêng mình, hạn chế quyền truy cập vào ứng dụng đó và lấy danh tính người dùng từ IAP.
Sản phẩm bạn sẽ tạo ra
Trong lớp học lập trình này, bạn sẽ tạo một ứng dụng web tối giản bằng Google App Engine, sau đó khám phá nhiều cách sử dụng Identity-Aware Proxy để hạn chế quyền truy cập vào ứng dụng và cung cấp thông tin nhận dạng người dùng cho ứng dụng đó. Ứng dụng này sẽ:
|
|
Kiến thức bạn sẽ học được
- Cách viết và triển khai một ứng dụng App Engine đơn giản bằng Python 3.7
- Cách bật và tắt tính năng mua hàng trong ứng dụng để hạn chế quyền truy cập vào ứng dụng
- Cách lấy thông tin nhận dạng người dùng từ giao dịch mua trong ứng dụng vào ứng dụng của bạn
- Cách xác minh thông tin từ IAP bằng phương pháp mật mã để chống lại hành vi giả mạo
Bạn cần có
- Một trình duyệt web hiện đại, chẳng hạn như Chrome.
- Kiến thức cơ bản về ngôn ngữ lập trình Python
Lớp học lập trình này tập trung vào Google App Engine và IAP. Các khái niệm và khối mã không liên quan được tinh chỉnh và cung cấp cho bạn, chỉ cần sao chép và dán.
2. Thiết lập
Bạn sẽ làm việc trong môi trường dòng lệnh Cloud Shell. Bắt đầu bằng cách mở môi trường đó và tìm nạp mã mẫu cho môi trường đó.
Khởi chạy Bảng điều khiển và Cloud Shell
Ở phần trên cùng bên trái của trang phòng thực hành, hãy nhấp vào nút Mở Bảng điều khiển Google. Bạn sẽ phải đăng nhập bằng Tên người dùng và Mật khẩu xuất hiện bên dưới nút đó. |
|
Tất cả các lệnh trong lớp học lập trình này sẽ được thực thi trong Cloud Shell cho dự án mà bạn đã tạo và mở. Mở Cloud Shell bằng cách nhấp vào biểu tượng Kích hoạt Cloud Shell ở bên phải tiêu đề trang bảng điều khiển. Nửa dưới của trang sẽ cho phép bạn nhập và chạy các lệnh.Bạn có thể chạy các lệnh này trên máy tính của mình, nhưng trước tiên, bạn phải cài đặt và định cấu hình phần mềm phát triển cần thiết. Cloud Shell đã có tất cả các công cụ phần mềm mà bạn cần. |
|
Tải mã xuống
Nhấp vào vùng dòng lệnh trong Cloud Shell để bạn có thể nhập các lệnh. Tìm nạp mã từ GitHub rồi chuyển sang thư mục mã:
git clone https://github.com/googlecodelabs/user-authentication-with-iap.git
cd user-authentication-with-iap
Thư mục này chứa một thư mục con cho mỗi bước của lớp học lập trình này. Bạn sẽ chuyển sang thư mục chính xác để thực hiện từng bước.
3. Bước 1 – Triển khai ứng dụng và bảo vệ ứng dụng bằng IAP
Đây là một ứng dụng App Engine Standard được viết bằng Python 3.7, chỉ hiển thị trang chào mừng "Hello, World". Chúng tôi sẽ triển khai và kiểm thử ứng dụng này, sau đó hạn chế quyền truy cập vào ứng dụng bằng IAP.
Xem xét mã xử lý ứng dụng
Thay đổi từ thư mục dự án chính sang thư mục con 1-HelloWorld chứa mã cho bước này.
cd 1-HelloWorld
Mã xử lý ứng dụng nằm trong tệp main.py. Ứng dụng này sử dụng khung web Flask để phản hồi các yêu cầu trên web bằng nội dung của một mẫu. Tệp mẫu đó nằm trong templates/index.html và ở bước này chỉ chứa HTML thuần tuý. Tệp mẫu thứ hai chứa một ví dụ cơ bản về chính sách quyền riêng tư ở định dạng templates/privacy.html.
Có hai tệp khác: requirements.txt liệt kê tất cả các thư viện Python không mặc định mà ứng dụng sử dụng và app.yaml cho Google Cloud Platform biết rằng đây là một ứng dụng App Engine Python 3.7.
Bạn có thể liệt kê từng tệp trong trình bao bằng lệnh cat, như trong ví dụ:
cat main.py
Hoặc bạn có thể mở trình soạn thảo mã Cloud Shell bằng cách nhấp vào biểu tượng Bút chì ở phía trên cùng bên phải của cửa sổ Cloud Shell, rồi kiểm tra mã theo cách đó.
Bạn không cần thay đổi bất kỳ tệp nào cho bước này.
Triển khai cho App Engine
Giờ đây, hãy triển khai ứng dụng vào môi trường tiêu chuẩn của App Engine cho Python 3.7
gcloud app deploy
Bạn có thể được yêu cầu chọn một vùng để triển khai. Chọn một trạm sạc bất kỳ gần bạn có ghi "hỗ trợ tiêu chuẩn". Khi bạn được hỏi có muốn tiếp tục hay không, hãy nhập Y để chọn có.
Sau vài phút, quá trình triển khai sẽ hoàn tất và bạn sẽ thấy thông báo cho biết bạn có thể xem ứng dụng của mình bằng gcloud app browse. Nhập lệnh đó. Nếu một thẻ mới không mở trong trình duyệt, hãy nhấp vào đường liên kết xuất hiện để mở đường liên kết đó trong một thẻ mới, hoặc sao chép đường liên kết đó vào một thẻ mới được mở theo cách thủ công nếu cần. Vì đây là lần đầu tiên ứng dụng này chạy, nên ứng dụng sẽ mất vài giây để xuất hiện trong khi một thực thể đám mây được khởi động và bạn sẽ thấy cửa sổ sau.

Bạn có thể mở cùng một URL đó trên bất kỳ máy tính nào kết nối với Internet để xem trang web đó. Quyền truy cập chưa bị hạn chế.
Hạn chế quyền truy cập bằng IAP
Trong cửa sổ bảng điều khiển trên đám mây, hãy nhấp vào biểu tượng trình đơn ở trên cùng bên trái của trang, nhấp vào Bảo mật rồi nhấp vào Identity-Aware Proxy. |
|
Vì đây là lần đầu tiên bạn bật một lựa chọn xác thực cho dự án này, nên bạn sẽ thấy một thông báo cho biết bạn phải định cấu hình màn hình xin phép bằng OAuth thì mới có thể sử dụng IAP. |
|
Nhấp vào NÚT ĐỊNH CẤU HÌNH MÀN HÌNH YÊU CẦU ĐỒNG Ý. Một thẻ mới sẽ mở ra để bạn định cấu hình màn hình xin phép. |
|
Điền các giá trị thích hợp vào chỗ trống bắt buộc:
Tên ứng dụng | Ví dụ về IAP |
Email của nhóm hỗ trợ | địa chỉ email của bạn. Có thể địa chỉ này đã được điền sẵn cho bạn. |
Miền được uỷ quyền | phần tên máy chủ của URL ứng dụng, ví dụ: iap-example-999999.appspot.com. Bạn có thể thấy phần này trong thanh địa chỉ của trang web Hello World mà bạn đã mở trước đó. Không thêm dấu |
Đường liên kết đến trang chủ của ứng dụng | URL mà bạn đã dùng để xem ứng dụng của mình |
Đường liên kết đến Chính sách quyền riêng tư của ứng dụng | đường liên kết đến trang quyền riêng tư trong ứng dụng, giống như đường liên kết đến trang chủ có thêm /privacy ở cuối |
Nhấp vào Lưu. Bạn sẽ được nhắc tạo thông tin đăng nhập. Bạn không cần tạo thông tin đăng nhập cho lớp học lập trình này, vì vậy, bạn chỉ cần đóng thẻ trình duyệt này.
Quay lại trang Identity-Aware Proxy rồi làm mới trang đó. Giờ đây, bạn sẽ thấy danh sách các tài nguyên mà bạn có thể bảo vệ.Nhấp vào nút bật/tắt trong cột IAP trong hàng ứng dụng App Engine để bật IAP. |
|
Bạn sẽ thấy tên miền được bảo vệ bằng IAP. Nhấp vào BẬT. |
|
Bây giờ, hãy mở một thẻ trình duyệt và chuyển đến URL cho ứng dụng của bạn. Bạn sẽ thấy màn hình Đăng nhập bằng Google yêu cầu bạn đăng nhập để truy cập vào ứng dụng. |
|
Đăng nhập bằng Tài khoản Google hoặc tài khoản G Suite. Bạn sẽ thấy một màn hình từ chối quyền truy cập của bạn. |
|
Bạn đã bảo vệ thành công ứng dụng của mình bằng IAP, nhưng bạn chưa cho IAP biết những tài khoản nào được phép truy cập.
Quay lại trang Identity-Aware Proxy của bảng điều khiển, chọn hộp đánh dấu bên cạnh ứng dụng App Engine và xem thanh bên ở bên phải trang. |
|
Bạn cần thêm từng địa chỉ email (hoặc địa chỉ Google Groups, hoặc tên miền G Suite) cần được cấp quyền truy cập làm Thành viên. Nhấp vào THÊM THÀNH VIÊN. Nhập địa chỉ email của bạn, sau đó chọn vai trò Người dùng ứng dụng web được bảo mật bằng IAP/Cloud IAP để chỉ định cho địa chỉ đó. Bạn có thể nhập thêm địa chỉ hoặc miền G Suite theo cách tương tự. |
|
Nhấp vào Lưu. Thông báo "Chính sách đã được cập nhật" sẽ xuất hiện ở cuối cửa sổ.
Quay lại ứng dụng của bạn rồi tải lại trang. Giờ đây, bạn sẽ thấy ứng dụng web của mình vì bạn đã đăng nhập bằng một người dùng mà bạn đã uỷ quyền. Tuy nhiên, bạn vẫn có thể thấy trang "Bạn không có quyền truy cập" vì IAP có thể không kiểm tra lại quyền của bạn. Trong trường hợp đó, hãy thực hiện các bước sau:
- Mở trình duyệt web đến địa chỉ trang chủ có
/_gcp_iap/clear_login_cookieđược thêm vào cuối URL, chẳng hạn nhưhttps://iap-example-999999.appspot.com/_gcp_iap/clear_login_cookie. - Bạn sẽ thấy màn hình Đăng nhập bằng Google mới, trong đó tài khoản của bạn đã xuất hiện. Không nhấp vào tài khoản đó. Thay vào đó, hãy nhấp vào Sử dụng một tài khoản khác rồi nhập lại thông tin đăng nhập của bạn.
- Các bước này khiến IAP kiểm tra lại quyền truy cập của bạn và giờ đây, bạn sẽ thấy màn hình chính của ứng dụng.
Nếu có quyền truy cập vào một trình duyệt khác hoặc có thể sử dụng Chế độ ẩn danh trong trình duyệt và có một tài khoản Gmail hoặc G Suite hợp lệ khác, bạn có thể sử dụng trình duyệt đó để chuyển đến trang ứng dụng của mình và đăng nhập bằng tài khoản khác. Vì tài khoản đó chưa được uỷ quyền, nên tài khoản đó sẽ thấy màn hình "Bạn không có quyền truy cập" thay vì ứng dụng của bạn.
4. Bước 2 – Truy cập vào thông tin nhận dạng người dùng
Sau khi được bảo vệ bằng IAP, ứng dụng có thể sử dụng thông tin nhận dạng mà IAP cung cấp trong các tiêu đề yêu cầu web mà ứng dụng truyền qua. Ở bước này, ứng dụng sẽ lấy địa chỉ email của người dùng đã đăng nhập và mã nhận dạng người dùng duy nhất liên tục do Dịch vụ nhận dạng của Google chỉ định cho người dùng đó. Dữ liệu đó sẽ được hiển thị cho người dùng trên trang chào mừng.
Đây là bước 2 và bước cuối cùng kết thúc bằng việc bạn mở Cloud Shell trong thư mục iap-codelab/1-HelloWorld. Chuyển sang thư mục cho bước này:
cd ~/iap-codelab/2-HelloUser
Triển khai lên App Engine
Vì quá trình triển khai mất vài phút, nên hãy bắt đầu bằng cách triển khai ứng dụng vào môi trường tiêu chuẩn của App Engine cho Python 3.7:
gcloud app deploy
Khi được hỏi liệu bạn có muốn tiếp tục hay không, hãy nhập Y để chọn có. Quá trình triển khai sẽ hoàn tất sau vài phút. Trong khi chờ đợi, bạn có thể kiểm tra các tệp ứng dụng như mô tả bên dưới.
Khi quá trình triển khai hoàn tất, bạn sẽ thấy một thông báo cho biết bạn có thể xem ứng dụng của mình bằng gcloud app browse. Nhập lệnh đó. Nếu một thẻ mới không mở trên trình duyệt, hãy sao chép đường liên kết xuất hiện và mở đường liên kết đó trong một thẻ mới như bình thường. Bạn sẽ thấy một trang tương tự như sau:

Bạn có thể cần đợi vài phút để phiên bản mới của ứng dụng thay thế phiên bản trước. Làm mới trang nếu cần để xem một trang tương tự như trang ở trên.
Kiểm tra các tệp ứng dụng
Thư mục này chứa cùng một bộ tệp như trong Bước 1, nhưng 2 tệp đã được thay đổi: main.py và templates/index.html. Chương trình đã được thay đổi để truy xuất thông tin người dùng mà IAP cung cấp trong tiêu đề yêu cầu và mẫu hiện hiển thị dữ liệu đó.
Có 2 dòng trong main.py nhận dữ liệu nhận dạng do IAP cung cấp:
user_email = request.headers.get('X-Goog-Authenticated-User-Email')
user_id = request.headers.get('X-Goog-Authenticated-User-ID')
Tiêu đề X-Goog-Authenticated-User- do IAP cung cấp và tên không phân biệt chữ hoa chữ thường, vì vậy, bạn có thể cung cấp tên bằng tất cả chữ thường hoặc tất cả chữ hoa nếu muốn. Giờ đây, câu lệnh render_template bao gồm những giá trị đó để có thể hiển thị:
page = render_template('index.html', email=user_email, id=user_id)
Mẫu index.html có thể hiển thị những giá trị đó bằng cách đặt tên trong dấu ngoặc nhọn kép:
Hello, {{ email }}! Your persistent ID is {{ id }}.
Như bạn thấy, dữ liệu được cung cấp có tiền tố accounts.google.com:, cho biết nguồn gốc của thông tin. Nếu muốn, ứng dụng của bạn có thể xoá mọi thứ cho đến dấu hai chấm (bao gồm cả dấu hai chấm) để lấy các giá trị thô.
Tắt tính năng mua hàng trong ứng dụng
Điều gì sẽ xảy ra với ứng dụng này nếu IAP bị vô hiệu hoá hoặc bằng cách nào đó bị bỏ qua (chẳng hạn như do các ứng dụng khác chạy trong cùng một dự án trên đám mây của bạn)? Tắt IAP để xem.
Trong cửa sổ bảng điều khiển trên đám mây, hãy nhấp vào biểu tượng trình đơn ở trên cùng bên trái của trang, nhấp vào Bảo mật rồi nhấp vào Identity-Aware Proxy. Nhấp vào nút bật/tắt IAP bên cạnh ứng dụng App Engine để tắt IAP. |
|
Bạn sẽ nhận được cảnh báo rằng thao tác này sẽ cho phép tất cả người dùng truy cập vào ứng dụng.
Làm mới trang web ứng dụng. Bạn sẽ thấy trang tương tự nhưng không có thông tin người dùng:

Vì ứng dụng hiện không được bảo vệ, nên người dùng có thể gửi một yêu cầu web có vẻ như đã thông qua IAP. Ví dụ: bạn có thể chạy lệnh curl sau đây từ Cloud Shell để thực hiện việc đó (thay thế <your-url-here> bằng URL chính xác cho ứng dụng của bạn):
curl -X GET <your-url-here> -H "X-Goog-Authenticated-User-Email: totally fake email"
Trang web sẽ xuất hiện trên dòng lệnh và có dạng như sau:
<!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>
Ứng dụng không thể biết rằng IAP đã bị vô hiệu hoá hoặc bị bỏ qua. Đối với những trường hợp có nguy cơ tiềm ẩn, bước 3 sẽ đưa ra một giải pháp.
5. Bước 3 – Sử dụng quy trình xác minh bằng mật mã
Nếu có nguy cơ IAP bị tắt hoặc bị bỏ qua, ứng dụng của bạn có thể kiểm tra để đảm bảo thông tin nhận dạng mà ứng dụng nhận được là hợp lệ. Thao tác này sử dụng tiêu đề yêu cầu web thứ ba do IAP thêm vào, có tên là X-Goog-IAP-JWT-Assertion. Giá trị của tiêu đề là một đối tượng được ký bằng mật mã, đồng thời chứa dữ liệu nhận dạng người dùng. Ứng dụng của bạn có thể xác minh chữ ký số và sử dụng dữ liệu được cung cấp trong đối tượng này để chắc chắn rằng dữ liệu đó do IAP cung cấp mà không bị thay đổi.
Quy trình xác minh chữ ký số đòi hỏi một số bước bổ sung, chẳng hạn như truy xuất bộ khoá công khai mới nhất của Google. Bạn có thể quyết định xem ứng dụng của mình có cần các bước bổ sung này hay không dựa trên rủi ro mà người dùng có thể tắt hoặc bỏ qua IAP, cũng như mức độ nhạy cảm của ứng dụng.
Đây là bước 3 và bước cuối cùng kết thúc bằng việc bạn mở Cloud Shell trong thư mục iap-codelab/2-HelloUser. Chuyển sang thư mục cho bước này:
cd ~/iap-codelab/3-HelloVerifiedUser
Triển khai cho App Engine
Triển khai ứng dụng vào môi trường tiêu chuẩn của App Engine cho Python 3.7:
gcloud app deploy
Khi được hỏi liệu bạn có muốn tiếp tục hay không, hãy nhập Y để chọn có. Quá trình triển khai sẽ hoàn tất sau vài phút. Trong khi chờ đợi, bạn có thể kiểm tra các tệp ứng dụng như mô tả bên dưới.
Khi quá trình triển khai hoàn tất, bạn sẽ thấy một thông báo cho biết bạn có thể xem ứng dụng của mình bằng gcloud app browse. Nhập lệnh đó. Nếu một thẻ mới không mở trên trình duyệt, hãy sao chép đường liên kết xuất hiện và mở đường liên kết đó trong một thẻ mới như bình thường.
Hãy nhớ rằng bạn đã tắt IAP ở Bước 2, vì vậy, không có dữ liệu IAP nào được cung cấp cho ứng dụng. Bạn sẽ thấy một trang tương tự như sau:

Như trước đây, bạn có thể cần đợi vài phút để phiên bản mới nhất hoạt động thì mới thấy phiên bản mới của trang.
Vì IAP bị tắt nên không có thông tin người dùng. Bây giờ, hãy bật lại tính năng mua hàng trong ứng dụng.
Trong cửa sổ bảng điều khiển trên đám mây, hãy nhấp vào biểu tượng trình đơn ở trên cùng bên trái của trang, nhấp vào Bảo mật rồi nhấp vào Identity-Aware Proxy. Nhấp vào nút bật/tắt IAP bên cạnh ứng dụng App Engine để bật lại IAP. |
|
Làm mới trang. Trang này sẽ có dạng như sau:

Xin lưu ý rằng địa chỉ email do phương thức xác minh cung cấp không có tiền tố accounts.google.com:.
Nếu IAP bị tắt hoặc bị bỏ qua, dữ liệu đã xác minh sẽ bị thiếu hoặc không hợp lệ, vì dữ liệu đó không thể có chữ ký hợp lệ trừ phi được tạo bởi người nắm giữ khoá riêng tư của Google.
Kiểm tra các tệp ứng dụng
Thư mục này chứa cùng một bộ tệp như trong Bước 2, với 2 tệp đã được sửa đổi và 1 tệp mới. Tệp mới là auth.py, cung cấp phương thức user() để truy xuất và xác minh thông tin nhận dạng đã ký mã hoá. Các tệp đã thay đổi là main.py và templates/index.html, hiện đang sử dụng kết quả của phương thức đó. Các tiêu đề chưa được xác minh như trong bước 2 cũng xuất hiện để so sánh.
Chức năng mới chủ yếu nằm trong hàm 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 là dữ liệu được ký mã hoá có trong tiêu đề của yêu cầu đã chỉ định. Mã này sử dụng một thư viện để xác thực và giải mã dữ liệu đó. Quá trình xác thực sử dụng các khoá công khai mà Google cung cấp để kiểm tra dữ liệu mà Google ký và biết đối tượng mà dữ liệu được chuẩn bị (về cơ bản, là dự án trên đám mây Google Cloud đang được bảo vệ). Các hàm trợ giúp keys() và audience() thu thập và trả về những giá trị đó.
Đối tượng đã ký có 2 phần dữ liệu mà chúng ta cần: địa chỉ email đã xác minh và giá trị mã nhận dạng duy nhất (được cung cấp trong sub, đối với trường chuẩn của người đăng ký).
Bước 3 đã hoàn tất.
6. Tóm tắt
Bạn đã triển khai một ứng dụng web App Engine. Ở Bước 1, bạn đã hạn chế quyền truy cập vào ứng dụng chỉ cho những người dùng mà bạn chọn. Ở Bước 2, bạn đã truy xuất và hiển thị danh tính của những người dùng mà IAP cho phép truy cập vào ứng dụng của bạn, đồng thời thấy cách thông tin đó có thể bị giả mạo nếu IAP bị vô hiệu hoá hoặc bị bỏ qua. Ở Bước 3, bạn đã xác minh các câu khẳng định được ký bằng mật mã về danh tính của người dùng mà không thể giả mạo.
7. Dọn dẹp
Tài nguyên duy nhất trên Google Cloud Platform mà bạn đã sử dụng trong lớp học lập trình này là các phiên bản App Engine. Mỗi lần bạn triển khai ứng dụng, một phiên bản mới sẽ được tạo và tiếp tục tồn tại cho đến khi bị xoá. Thoát khỏi phòng thí nghiệm để xoá dự án và tất cả tài nguyên trong dự án đó.











