Xác thực người dùng bằng Proxy nhận dạng danh tính

1. Giới thiệu

Việc xác thực người dùng ứng dụng web của bạn thường là việc cần thiết và thường yêu cầu bạn phải lập trình đặc biệt trong ứng dụng của mình. Đối với các ứng dụng Google Cloud Platform, bạn có thể chuyển những trách nhiệm này cho dịch vụ Proxy nhận dạng danh tính. Nếu chỉ cần hạn chế quyền truy cập đối với những người dùng đã chọn, bạn không cần thực hiện thay đổi nào đối vớ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ư để duy trì lựa chọn ưu tiên của người dùng ở phía máy chủ), thì Proxy nhận dạng nhận dạng có thể cung cấp mã xử lý ứng dụng tối thiểu.

Proxy nhận dạng là gì?

Proxy nhận biết danh tính (IAP) là một dịch vụ của Google Cloud Platform chặn các yêu cầu web được gửi tới ứ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 yêu cầu nếu yêu cầu đó đến từ người dùng mà bạn cho phép. Ngoài ra, công cụ này có thể sửa đổi tiêu đề của yêu cầu để bao gồ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à nhận 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ẽ xây dựng một ứng dụng web tối thiểu 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ẽ:

  • Hiển thị trang chào mừng
  • Truy cập thông tin nhận dạng người dùng do IAP cung cấp
  • Sử dụng phương pháp xác minh bằng mật mã để ngăn chặn việc giả mạo thông tin danh tính người dùng

Kiến thức bạn sẽ học được

  • Cách viết và triển khai ứng dụng App Engine đơn giản bằng Python 3.7
  • Cách bật và tắt IAP để hạn chế quyền truy cập vào ứng dụng của bạn
  • Cách đưa thông tin danh tính người dùng từ IAP vào ứng dụng của bạn
  • Cách xác minh thông tin từ IAP bằng mã hoá để ngăn chặn hành vi giả mạo

Bạn cần có

  • Một trình duyệt web hiện đại 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 che khuất và chỉ được cung cấp cho bạ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. Hãy bắt đầu bằng cách mở môi trường đó rồi tìm nạp mã mẫu vào môi trường đó.

Chạy Console và Cloud Shell

Ở phần trên bên trái của trang phòng thí nghiệm, hãy nhấp vào nút Mở Google Console. Bạn sẽ phải đăng nhập bằng Tên người dùng và Mật khẩu được hiển thị 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 đã được tạo và mở cho bạn. 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.Các lệnh có thể chạy từ máy tính của riêng bạn, nhưng trước tiên bạn sẽ 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ã nguồn xuống

Nhấp vào khu vực dòng lệnh trong Cloud Shell để bạn có thể nhập lệnh. Tìm nạp mã từ GitHub rồi thay đổi 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 đúng thư mục để thực hiện từng bước.

3. Bước 1 – Triển khai 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ị dòng chữ "Hello, World" ("Xin chào thế giới") trang chào mừng. Chúng tôi sẽ triển khai và thử nghiệm ứng dụng, sau đó hạn chế quyền truy cập vào ứng dụng bằng IAP.

Xem lại 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. Lớp này sử dụng khung web Flask để phản hồi các yêu cầu web có chứa nội dung của mẫu. Tệp mẫu đó nằm trong templates/index.html và đối với bước này chỉ chứa HTML thuần tuý. Tệp mẫu thứ hai chứa chính sách quyền riêng tư về cơ thể trong templates/privacy.html.

Có hai tệp khác: requirements.txt liệt kê tất cả thư viện Python không phải thư viện mặc định mà ứng dụng sử dụng, và app.yaml cho Google Cloud Platform biết rằng đây là ứng dụng Python 3.7 App Engine.

Bạn có thể liệt kê từng tệp trong shell bằng lệnh mèo, như trong:

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ì ở trên cùng bên phải cửa sổ Cloud Shell và kiểm tra mã theo cách đó.

Bạn không cần thay đổi tệp nào cho bước này.

Triển khai cho App Engine

Bây giờ, hãy triển khai ứng dụng vào môi trường App Engine Standard cho Python 3.7

gcloud app deploy

Bạn có thể được yêu cầu chọn một khu vực để triển khai. Chọn bất kỳ ứng dụng nào ở gần bạn cho biết thiết bị này "hỗ trợ tiêu chuẩn". Khi được hỏi bạn có muốn tiếp tục hay không, hãy nhập Y cho câu trả lời có.

Quá trình triển khai sẽ hoàn tất trong vài phút nữa và 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 thẻ mới không mở trong trình duyệt của bạn, hãy nhấp vào liên kết được hiển thị để mở thẻ đó trong thẻ mới hoặc sao chép liên kết đó vào thẻ mới được mở theo cách thủ công nếu cần. Vì đây là lần đầu tiên chạy ứng dụng này, nên sẽ mất một vài giây để ứng dụng này xuất hiện khi phiên bản đám mây khởi động. Bạn sẽ thấy cửa sổ sau đây.

1c1c0b166c6023e.png.

Bạn có thể mở cùng một URL đó từ 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 giao dịch mua hàng trong ứng dụng (IAP)

Trong cửa sổ Cloud Console, hãy nhấp vào biểu tượng trình đơn ở trên cùng bên trái của trang, sau đó nhấp vào Security (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 tuỳ 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 trước khi có thể sử dụng IAP.

Nhấp vào NÚT PHIẾU ĐỒNG Ý CẤU HÌNH. Một thẻ mới sẽ mở ra để bạn thiết lập 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ể đã được điền sẵn cho bạn.

Miền được uỷ quyền

phần tên máy chủ trong URL của ứng dụng, ví dụ: iap-example-999999.appspot.com. Bạn có thể thấy thông tin này trong thanh địa chỉ của trang web Hello World mà bạn đã mở trước đó. Đừng thêm https:// bắt đầu hoặc ở cuối / trong URL đó.Bạn phải nhấn Enter sau khi điền giá trị này.

Đườ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 xác thực. 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 nên chỉ cần đóng thẻ trình duyệt này.

Quay lại trang Proxy nhận biết danh tính rồi làm mới trang đó. Bây giờ, bạn sẽ thấy một danh sách các tài nguyên mà mình có thể bảo vệ.Hãy nhấp vào nút bật tắt trong cột IAP ở hàng ứng dụng App Engine để bật IAP.

Bạn sẽ thấy những tên miền sẽ được bảo vệ bởi 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ột màn hình Đăng nhập bằng Google yêu cầu bạn đăng nhập để truy cập ứng dụng.

Đăng nhập bằng tài khoản Google hoặc G Suite. Bạn sẽ thấy một màn hình từ chối cấp quyền truy cập.

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 cần cho phép thông qua tài khoản nào.

Quay lại trang Identity-Aware Proxy của bảng điều khiển, chọn hộp kiểm bên cạnh ứng dụng App Engine và xem thanh bên ở bên phải của trang.

Bạn cần thêm mỗi địa chỉ email (hoặc địa chỉ nhóm trên Google Groups hay tên miền G Suite) được phép truy cập với tư cách là 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 trên Google Cloud IAP/IAP được bảo mật để 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 "Đã cập nhật chính sách" sẽ xuất hiện ở cuối cửa sổ.

Quay lại ứng dụng của bạn và tải lại trang. Bây giờ, bạn sẽ thấy ứng dụng web của mình vì bạn đã đăng nhập bằng người dùng được bạn uỷ quyền. Tuy nhiên, bạn vẫn có thể thấy thông báo "Bạn không có quyền truy cập" vì IAP có thể không kiểm tra lại sự cho phép của bạn. Trong trường hợp đó, hãy làm theo các bước sau:

  • Mở trình duyệt web và truy cập vào địa chỉ trang chủ có thêm /_gcp_iap/clear_login_cookie vào cuối URL, như trong 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, với tài khoản của bạn đã hiển thị. Không nhấp vào tài khoản. Thay vào đó, hãy nhấp vào Sử dụng 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 sẽ khiến IAP kiểm tra lại quyền truy cập của bạn và giờ 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 đó. Vì tài khoản đó chưa được uỷ quyền, nên tài khoản sẽ thấy thông báo "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 đề của yêu cầu web mà ứng dụng đó chuyển qua. Trong 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 cố định do Dịch vụ nhận dạng của Google chỉ định cho người dùng đó. Người dùng sẽ thấy dữ liệu đó trên trang chào mừng.

Đây là bước 2 và bước cuối cùng đã kết thúc khi Cloud Shell mở trong thư mục iap-codelab/1-HelloWorld. Thay đổi thành thư mục cho bước này:

cd ~/iap-codelab/2-HelloUser

Triển khai cho App Engine

Vì quá trình triển khai mất vài phút, hãy bắt đầu bằng cách triển khai ứng dụng cho môi trường App Engine Standard cho Python 3.7:

gcloud app deploy

Khi bạn được hỏi có muốn tiếp tục hay không, hãy nhập Y cho câu trả lời có. Quá trình triển khai sẽ hoàn tất sau vài phút nữa. Trong khi chờ đợi, bạn có thể kiểm tra các tệp ứng dụng như được mô tả bên dưới.

Khi quá trình triển khai đã sẵn sàng, bạn sẽ thấy một thông báo cho biết bạn có thể xem ứng dụng bằng gcloud app browse. Nhập lệnh đó. Nếu có thẻ mới không mở trên trình duyệt, hãy sao chép đường liên kết được hiển thị rồi mở trong thẻ mới theo cách thông thường. Bạn sẽ thấy một trang tương tự như sau:

5b5fb03111258cec.png.

Bạn có thể phải chờ vài phút để phiên bản mới của ứng dụng thay thế phiên bản trước đó. Hãy làm mới trang nếu cần để xem một trang tương tự như trên.

Kiểm tra tệp ứng dụng

Thư mục này chứa cùng một nhóm tệp như bạn thấy trong Bước 1, nhưng hai trong số các tệp đã thay đổi: main.pytemplates/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 đề của yêu cầu và mẫu giờ đây hiển thị dữ liệu đó.

Có hai 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')

Các tiêu đề X-Goog-Authenticated-User- do IAP cung cấp và tên này không phân biệt chữ hoa chữ thường, vì vậy, bạn có thể sử dụng cả chữ hoa hoặc chữ thường viết hoa nếu muốn. Câu lệnh display_template hiện bao gồm các giá trị đó để có thể hiển thị:

page = render_template('index.html', email=user_email, id=user_id)

Mẫu chỉ mục.html có thể hiển thị các 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 có thể thấy, dữ liệu đã cung cấp có tiền tố là accounts.google.com: để cho biết nguồn gốc của thông tin. Ứng dụng của bạn có thể xoá mọi thông tin cho đến và bao gồm cả dấu hai chấm để nhận các giá trị thô (nếu muốn).

Tắt giao dịch mua hàng trong ứng dụng (IAP)

Điều gì sẽ xảy ra với ứng dụng này nếu IAP bị tắt 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 đám mây của bạn)? Bạn có thể tắt IAP để xem.

Trong cửa sổ Cloud Console, hãy nhấp vào biểu tượng trình đơn ở trên cùng bên trái của trang, sau đó nhấp vào Security (Bảo mật) rồi nhấp vào Identity-Aware Proxy. Nhấp vào nút chuyển bật tắt IAP bên cạnh ứng dụng App Engine để tắt IAP.

Bạn sẽ được cảnh báo rằng thao tác này sẽ cho phép tất cả người dùng đều truy cập vào ứng dụng.

Làm mới trang web của ứng dụng. Bạn sẽ thấy cùng một trang, nhưng không có bất kỳ thông tin nào về người dùng:

17c850de95fea839.pngS

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>

Không có cách nào để ứng dụng biết rằng IAP đã bị vô hiệu hoá hoặc bỏ qua. Đối với trường hợp đó là nguy cơ tiềm ẩn, bước 3 là đưa ra giải pháp.

5. Bước 3 – Sử dụng phương thức xác minh bằng mật mã

Nếu có nguy cơ IAP bị tắt hoặc bỏ qua, thì ứng dụng của bạn có thể kiểm tra để đảm bảo rằng thông tin nhận dạng mà ứng dụng nhận được là hợp lệ. Tính năng 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 đã ký dạng mật mã và cũng chứa dữ liệu về danh tính người dùng. Ứng dụng của bạn có thể xác minh chữ ký số và dùng dữ liệu được cung cấp trong đối tượng này để đảm bảo rằng chữ ký đó là do IAP cung cấp mà không bị thay đổi.

Quy trình xác minh chữ ký số yêu cầu bạn thực hiện thêm một số bước, 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 nguy cơ người khác có thể tắt hoặc bỏ qua IAP, cũng như tính 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 khi Cloud Shell mở trong thư mục iap-codelab/2-HelloUser. Thay đổi thành 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 trong môi trường App Engine Standard cho Python 3.7:

gcloud app deploy

Khi bạn được hỏi có muốn tiếp tục hay không, hãy nhập Y cho câu trả lời có. Quá trình triển khai sẽ hoàn tất sau vài phút nữa. Trong khi chờ đợi, bạn có thể kiểm tra các tệp ứng dụng như được mô tả bên dưới.

Khi quá trình triển khai đã sẵn sàng, bạn sẽ thấy một thông báo cho biết bạn có thể xem ứng dụng bằng gcloud app browse. Nhập lệnh đó. Nếu có thẻ mới không mở trên trình duyệt, hãy sao chép đường liên kết được hiển thị rồi mở trong thẻ mới theo cách thông 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:

8ef2abcc23d96958.png.

Như trước đây, bạn có thể phải chờ vài phút để phiên bản mới nhất xuất hiện thì mới xem được phiên bản mới của trang.

Vì IAP đã bị tắt nên sẽ không có thông tin người dùng nào. Bây giờ, hãy bật lại IAP.

Trong cửa sổ Cloud Console, hãy nhấp vào biểu tượng trình đơn ở trên cùng bên trái của trang, sau đó nhấp vào Security (Bảo mật) rồi nhấp vào Identity-Aware Proxy. Nhấp vào nút chuyển đổi IAP bên cạnh ứng dụng App Engine để bật lại IAP.

Hãy làm mới trang. Trang sẽ có dạng như sau:

3a4d93c11f228852.pngS

Xin lưu ý rằng địa chỉ email mà 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, thì dữ liệu đã xác minh sẽ bị thiếu hoặc không hợp lệ vì không thể có chữ ký hợp lệ trừ khi IAP do chủ sở hữu khoá riêng tư của Google tạo ra.

Kiểm tra tệp ứng dụng

Thư mục này chứa cùng một tập hợp tệp như đã thấy trong Bước 2, với hai tệp được thay đổi và một 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ý ở dạng mã hoá. Các tệp đã thay đổi là main.pytemplates/index.html, hiện đang sử dụng kết quả của phương thức đó. Những tiêu đề chưa được xác minh như trong bước 2 cũng sẽ xuất hiện để so sánh.

Chức năng mới này 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 đã ký dạng mật mã được cung cấp trong tiêu đề của yêu cầu được chỉ định. Mã này sử dụng thư viện để xác thực và giải mã dữ liệu đó. Quy 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 được ký hiệu và biết được dữ liệu được chuẩn bị cho đối tượng nào (về cơ bản là dự án Google Cloud đang được bảo vệ). Các hàm trợ giúp keys()audience() thu thập và trả về các 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 trường tiêu chuẩn đối với người đăng ký là sub).

Việc này là hoàn tất Bước 3.

6. Tóm tắt

Bạn đã triển khai một ứng dụng web App Engine. Ở Bước 1, bạn đã giới hạn 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 người dùng mà IAP cho phép truy cập vào ứng dụng của bạn, đồng thời nhận thấy thông tin đó có thể bị giả mạo như thế nào nếu IAP bị vô hiệu hoá hoặc bị bỏ qua. Ở Bước 3, bạn đã xác minh xác nhận bằng mật mã về danh tính của người dùng và xác nhận danh tính này không được giả mạo.

7. Dọn dẹp

Tài nguyên Google Cloud Platform duy nhất 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.