Xác thực người dùng bằng Identity-Aware Proxy

Việc xác thực người dùng ứng dụng web của bạn thường là cần thiết và thường yêu cầu lập 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 các trách nhiệm đó sang dịch vụ Identity-Aware Proxy. Nếu bạn chỉ cần giới hạn quyền truy cập cho người dùng đã chọn, 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ư để giữ tùy chọn người dùng phía máy chủ), Identity-Aware Proxy có thể cung cấp điều đó với mã ứng dụng tối thiểu.

Proxy Identity-Aware là gì?

Identity-Aware Proxy (IAP) là một dịch vụ của Google Cloud Platform chặn các yêu cầu 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 cách sử dụng Dịch vụ Google Identity và chỉ cho phép các yêu cầu xuất phát từ một người dùng mà bạn cho phép. Ngoài ra, tiêu đề 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 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á các cách khác nhau để sử dụng Proxy danh tính để 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 tính năng xác minh bằng mật mã để ngăn chặn hành vi giả mạo thông tin nhận dạng 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 lấy thông tin nhận dạng 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ảo vệ bản thân khỏi 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 sẽ được tô bóng và được cung cấp để bạn chỉ cần sao chép và dán.

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 đó và tìm nạp mã mẫu trong môi trường đó.

Chạy Bảng điều khiển và Cloud Shell

Ở phần trên bên trái của trang 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 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 mà bạn đã 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 của tiêu đề trang. Nửa dưới của trang sẽ cho phép bạn nhập và chạy các lệnh.

Những lệnh này có thể chạy trên máy tính của bạn, nhưng 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 trước tiên. 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 để nhập các lệnh. Tìm nạp mã từ Github rồi thay đổi thành thư mục mã:

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

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.

Đây là một ứng dụng App Engine Standard được viết bằng Python 3.7, chỉ hiển thị trang "quot;Hello, World" chào mừng bạn. Chúng tôi sẽ triển khai và kiểm tra, sau đó hạn chế quyền truy cập vào trang web bằng IAP.

Xem lại mã ứng dụng

Thay đổi từ thư mục dự án chính thành thư mục con 1-HelloWorld chứa mã cho bước này.

cd 1-HelloWorld

Mã ứ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ó nội dung của một mẫu. Tệp mẫu đó nằm trong templates/index.html và cho bước này chỉ chứa HTML thuần túy. Tệp mẫu thứ hai chứa chính sách quyền riêng tư mẫu cho templates/privacy.html.

Có hai tệp khác: requirements.txt liệt kê tất 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 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 chỉnh sửa mã của 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 và kiểm tra mã theo cách đó.

Bạn không cần phải 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 lên 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. Hãy chọn một tổ chức ở gần bạn có nội dung rằng "hỗ trợ tiêu chuẩn". Khi bạn được hỏi bạn có muốn tiếp tục không, hãy nhập Y để đồng ý.

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 của bạn, hãy nhấp vào đường liên kết hiển thị để mở thẻ đó 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, sẽ mất vài giây để ứng dụng này xuất hiện trong khi ứng dụng khởi động trên đám mây. Bạn sẽ thấy cửa sổ sau.

Bạn có thể mở cùng một URL từ máy tính bất kỳ kết nối với Internet để xem trang web đó. Chưa bị hạn chế quyền truy cập.

Hạn chế quyền truy cập vớ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, nhấp vào Security (Bảo mật), sau đó nhấp vào Identity-Aware Proxy.

Vì đây là lần đầu tiên bạn bật tùy chọn xác thực cho dự án này, nên bạn sẽ thấy thông báo rằng 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 CHẤP NHẬN THÔNG TIN CHẤP NHẬN THÔNG BÁO. Một thẻ mới sẽ mở để định cấu hình màn hình đồng ý.

Điền các khoảng trống bắt buộc với các giá trị thích hợp:

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 cho bạn.

Miền được ủy quyền

phần tên máy chủ của 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 dùng https:// ở đầu hoặc ở cuối / trong URL đó.

Bạn phải nhấn phím Enter sau khi điền giá trị này.

Đường liên kết đến trang chủ của ứng dụng

URL bạn đã dùng để xem ứng dụng

Đườ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 quyền riêng tư

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 xác thực cho lớp học lập trình này để có thể chỉ cần đóng thẻ trình duyệt này.

Quay lại trang Proxy của chương trình Identity-Aware và 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 của App Engine để bật IAP.

Bạn sẽ thấy các tên miền sẽ được IAP bảo vệ. 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 truy cập.

Bạn đã bảo vệ ứng dụng của mình bằng IAP, nhưng bạn chưa cho IAP biết tài khoản nào cần cho phép.

Hãy quay lại trang Proxy-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ỉ Nhóm Google, hoặc tên miền G Suite) vào quyền truy cập với tư cách 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 vệ bằng IAP/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 và tải lại trang. Lúc nà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 ủy quyền. Tuy nhiên, bạn vẫn có thể thấy trang & quot; Bạn không có quyền truy cập & quot; 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 bằng địa chỉ trang chủ, trong đó /_gcp_iap/clear_login_cookie được thêm 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 mới bằng Google với tài khoản của bạn đã hiển thị. Vui lòng 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 và nhập lại thông tin đăng nhập.
  • Các bước này khiến IAP kiểm tra lại quyền truy cập của bạn và bây giờ bạn sẽ thấy màn hình chính của ứng dụng.

Nếu bạn 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 của mình và có tài khoản Gmail hoặc G Suite hợp lệ khác, thì bạn có thể sử dụng trình duyệt đó để điều hướng đến trang ứng dụng và đăng nhập bằng tài khoản khác. Vì tài khoản đó chưa được cấp phép nên tài khoản sẽ hiển thị màn hình "Bạn không có quyền truy cập" thay vì ứng 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 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ẽ nhận được địa chỉ email của người dùng đã đăng nhập và mã nhận dạng riêng của người dùng mà Dịch vụ Google Identity gán cho người dùng đó. Dữ liệu đó sẽ hiển thị với người dùng trong 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 đối với 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 trong môi trường App Engine Standard cho Python 3.7:

gcloud app deploy

Khi bạn được hỏi bạn có muốn tiếp tục hay không, hãy nhập Y nếu bạn muốn. 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ư được mô tả dưới đây.

Khi quá trình triển khai đã sẵn sàng, bạn sẽ thấy thông báo rằng 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ở trên trình duyệt của bạn, hãy sao chép đường liên kết hiển thị và mở đường liên kết đó trong thẻ mới bình thường. Bạn sẽ thấy một trang tương tự như sau:

Bạn có thể cần phải đợi 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ước 1, nhưng hai trong số các tệp này đã được 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 hiện sẽ hiển thị dữ liệu đó.

Có hai dòng trong main.py lấy dữ liệu danh tính 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- là do IAP cung cấp và tên không phân biệt chữ hoa chữ thường, vì vậy, chúng có thể được đặt bằng tất cả các chữ hoa hoặc chữ thường nếu được ưu tiên. Câu lệnh Rendertron_template hiện bao gồm các giá trị đó để chúng 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ị 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 thông tin đó đến từ đâu. Ứng dụng của bạn có thể xóa mọi nội dung lên tới và bao gồm dấu hai chấm để nhận các giá trị thô nếu muốn.

Tắt IAP

Điều gì sẽ xảy ra với ứng dụng này nếu IAP bị vô hiệu hóa 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 dự án trên đám mây của bạn)? 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, nhấp vào Security (Bảo mật), sau đó 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ẽ được cảnh báo rằng việ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 cùng một trang, 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ư đã được chuyển 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 <your-url-here> bằng URL chính xác cho ứng dụng):

curl -X GET <your-url-here> -H "X-Goog-Authenticated-User-Email: totally fake email"

Trang web này sẽ hiển thị trên dòng lệnh và trông giố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 được rằng IAP đã bị vô hiệu hóa hoặc bị bỏ qua. Đối với các trường hợp có nguy cơ tiềm ẩn, bước 3 sẽ hiển thị một giải pháp.

Nếu có nguy cơ IAP bị tắt hoặc bị bỏ qua, thì ứ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ệ. Tiêu đề này sử dụng tiêu đề yêu cầu web thứ ba do IAP thêm, được gọi là X-Goog-IAP-JWT-Assertion. Giá trị của tiêu đề là đối tượng được ký mã hóa, cũng 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 chữ ký đó do IAP cung cấp mà không có thay đổi.

Việc xác minh chữ ký số yêu cầu thêm một số bước, chẳng hạn như truy xuất bộ khóa 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 thực hiện các bước bổ sung này hay không dựa trên rủi ro mà ai đó 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 khi Cloud Shell mở trong thư mục iap-codelab/2-HelloUser. Thay đổi đối với 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 lên môi trường App Engine Standard cho Python 3.7:

gcloud app deploy

Khi bạn được hỏi bạn có muốn tiếp tục hay không, hãy nhập Y nếu bạn muốn. 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ư được mô tả dưới đây.

Khi quá trình triển khai đã sẵn sàng, bạn sẽ thấy thông báo rằng 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ở trên trình duyệt của bạn, hãy sao chép đường liên kết hiển thị và mở đường liên kết đó trong thẻ mới bình thường.

Nhớ lại rằng bạn đã vô hiệu hóa IAP trong Bước 2, vì vậy sẽ 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 phải chờ vài phút để phiên bản mới nhất hoạt động để 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 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, nhấp vào Security (Bảo mật), sau đó 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.

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

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 bạn tắt hoặc bỏ qua IAP, thì dữ liệu đã xác minh sẽ bị thiếu hoặc không hợp lệ, vì dữ liệu không được có chữ ký hợp lệ trừ khi chủ sở hữu khóa 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ý bằng mật mã. Các tệp đã thay đổi là main.pytemplates/index.html, hiện sử dụng kết quả của phương thức đó. Các tiêu đề chưa được xác minh như đã tìm thấy trong bước 2 cũng được hiển thị để so sánh.

Chức năng mới chủ yếu 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ý bằng mật mã được cung cấp 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 đó. Tính năng xác thực sử dụng khóa công khai mà Google cung cấp để kiểm tra dữ liệu mà khóa ký, đồng thời biết được đối tượng mà dữ liệu đã được chuẩn bị (về cơ bản là dự án Google Cloud đang được bảo vệ). Hàm Trợ giúp keys()audience() thu thập và trả về các giá trị đó.

Đối tượng đã ký có hai phần dữ liệu mà chúng tôi 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 người đăng ký, tiêu chuẩn).

Đây là bước hoàn thành Bước 3.

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

Các tài nguyên Google Cloud Platform duy nhất 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 được tạo và tiếp tục tồn tại cho đến khi bị xóa. Thoát khỏi phòng thí nghiệm để xóa dự án và tất cả tài nguyên trong phòng thí nghiệm đó.