Hướng dẫn từng bước

Loạt hướng dẫn từng bước này minh hoạ tất cả các phần chuyển động của một tiện ích bổ sung đang hoạt động cho Lớp học. Mỗi bước hướng dẫn từng bước đều đề cập đến các khái niệm cụ thể và triển khai các khái niệm đó trong một ứng dụng web duy nhất. Mục tiêu là giúp bạn thiết lập, định cấu hình và khởi chạy một tiện ích bổ sung chức năng.

Tiện ích bổ sung của bạn phải tương tác với một dự án trên Google Cloud. Nếu chưa hiểu rõ về Google Cloud, bạn nên đọc Hướng dẫn bắt đầu sử dụng. Bạn sẽ quản lý thông tin đăng nhập, quyền truy cập vào API và SDK của Google Workspace Marketplace trong bảng điều khiển Google Cloud. Để biết thêm thông tin về SDK Marketplace, hãy truy cập vào trang hướng dẫn về trang thông tin trên Google Workspace Marketplace.

Hướng dẫn này bao gồm các chủ đề sau:

  • Sử dụng Google Cloud để tạo một trang sẽ hiển thị trong iframe trong Lớp học.
  • Thêm dịch vụ đăng nhập một lần (SSO) của Google và cho phép người dùng đăng nhập.
  • Thực hiện lệnh gọi API để đính kèm tiện ích bổ sung vào bài tập.
  • Đáp ứng các yêu cầu chính khi gửi tiện ích bổ sung và các tính năng bắt buộc.

Hướng dẫn này giả định rằng bạn đã quen thuộc với các khái niệm cơ bản về lập trình và phát triển web. Bạn nên đọc Hướng dẫn cấu hình dự án trước khi bắt đầu hướng dẫn từng bước. Trang này chứa thông tin cấu hình quan trọng chưa được đề cập đầy đủ trong hướng dẫn từng bước.

Ví dụ về cách triển khai

Bạn có thể xem một ví dụ tham chiếu hoàn chỉnh trong Python. Các phương thức triển khai từng phần cũng có trong JavaNode.js. Các hoạt động triển khai này là nguồn của mã mẫu có trên các trang tiếp theo.

Nơi tải xuống

Các ví dụ về Python và Java có trong kho lưu trữ GitHub:

Bạn có thể tải mẫu Node.js xuống dưới dạng tệp zip:

Điều kiện tiên quyết

Hãy xem các mục sau để chuẩn bị cho một dự án mới về tiện ích bổ sung.

Chứng chỉ HTTPS

Mặc dù bạn có thể lưu trữ ứng dụng trên mọi môi trường phát triển, nhưng tiện ích bổ sung của Lớp học chỉ dùng được thông qua https://. Do đó, bạn cần một máy chủ được mã hoá SSL để triển khai ứng dụng hoặc kiểm thử ứng dụng trong iframe của tiện ích bổ sung.

Bạn có thể sử dụng localhost với chứng chỉ SSL; hãy cân nhắc sử dụng mkcert nếu cần tạo chứng chỉ để phát triển cục bộ.

Dự án Google Cloud

Bạn cần định cấu hình một dự án trên Google Cloud để sử dụng với các ví dụ này. Hãy xem hướng dẫn tạo dự án trên Google Cloud để biết thông tin tổng quan về các bước cần thiết để bắt đầu. Phần Thiết lập dự án Google Cloud trong hướng dẫn từng bước đầu tiên cũng hướng dẫn các bước thực hiện các thao tác định cấu hình cụ thể.

Khi hoàn tất, hãy tải Mã ứng dụng khách OAuth 2.0 xuống dưới dạng tệp JSON; bạn cần thêm tệp thông tin xác thực này vào thư mục mẫu đã giải nén. Xem phần Tìm hiểu về tệp để biết những vị trí cụ thể.

Thông tin đăng nhập OAuth

Hãy làm theo các bước sau để tạo thông tin đăng nhập OAuth mới:

  • Chuyển đến trang Thông tin đăng nhập Google Cloud. Hãy đảm bảo rằng bạn đã chọn đúng dự án ở đầu màn hình.
  • Nhấp vào TẠO ĐIỀU KIỆN rồi chọn Mã ứng dụng khách OAuth trong trình đơn thả xuống.
  • Trên trang tiếp theo:
    • Đặt Application type (Loại ứng dụng) thành Web application (Ứng dụng web).
    • Trong mục URI chuyển hướng được uỷ quyền, hãy nhấp vào THÊM URI. Thêm đường dẫn đầy đủ cho tuyến gọi lại cho ứng dụng của bạn. Ví dụ: https://my.domain.com/auth-callback hoặc https://localhost:5000/callback. Bạn sẽ tạo và xử lý tuyến này ở phần sau của hướng dẫn từng bước này. Bạn có thể chỉnh sửa hoặc bổ sung các tuyến đường như vậy bất cứ lúc nào.
    • Nhấp vào TẠO.
  • Sau đó, bạn sẽ nhận được hộp thoại có thông tin đăng nhập mới tạo. Chọn tuỳ chọn TẢI JSON XUỐNG. Sao chép tệp JSON đã tải xuống vào thư mục máy chủ.

Điều kiện tiên quyết theo ngôn ngữ cụ thể

Hãy xem tệp README trong mỗi kho lưu trữ để biết danh sách các điều kiện tiên quyết mới nhất.

Python

Ví dụ về Python của chúng tôi sử dụng khung Flask. Bạn có thể tải mã nguồn hoàn chỉnh xuống từ các đường liên kết được cung cấp.

Nếu cần, hãy cài đặt Python 3.7+ và đảm bảo rằng pip có sẵn.

python3 -m ensurepip --upgrade

Bạn cũng nên thiết lập và kích hoạt một môi trường ảo Python mới.

python3 -m venv .classroom-addon-env
source .classroom-addon-env/bin/activate

Có một requirements.txt trong mỗi thư mục con hướng dẫn từng bước trong các ví dụ đã tải xuống. Bạn có thể nhanh chóng cài đặt các thư viện cần thiết bằng pip. Hãy dùng các lệnh sau để cài đặt các thư viện cần thiết cho bước hướng dẫn từng bước đầu tiên.

cd flask/01-basic-app
pip install -r requirements.txt

Node.js

Ví dụ Node.js của chúng tôi sử dụng khung Express. Bạn có thể tải mã nguồn hoàn chỉnh xuống từ đường liên kết được cung cấp.

Ví dụ này yêu cầu phiên bản Node.js v16.13 trở lên.

Cài đặt các mô-đun nút bắt buộc bằng npm.

npm install

Java

Ví dụ Java của chúng tôi sử dụng khung khởi động mùa xuân. Bạn có thể tải mã nguồn hoàn chỉnh xuống từ đường liên kết được cung cấp.

Cài đặt Java 11 trở lên nếu bạn chưa cài đặt ứng dụng này trên máy.

Các ứng dụng Spring Boot có thể dùng Gradle hoặc Maven để xử lý các bản dựng và quản lý các phần phụ thuộc. Ví dụ này bao gồm trình bao bọc Maven giúp đảm bảo xây dựng thành công mà không yêu cầu bạn phải cài đặt chính Maven.

Trong thư mục mà bạn đã tải xuống hoặc sao chép dự án, hãy chạy các lệnh sau để đảm bảo bạn có điều kiện tiên quyết để chạy dự án.

java --version
./mvnw --version

Hoặc trên Windows:

java -version
mvnw.cmd --version

Tìm hiểu về tệp

Phần sau đây mô tả bố cục của các thư mục mẫu.

Tên thư mục

Mỗi kho lưu trữ chứa một số thư mục có tên bắt đầu bằng một số, chẳng hạn như /01-basic-app/. Những con số này tương ứng với các bước hướng dẫn từng bước cụ thể. Mỗi thư mục chứa một ứng dụng web có đầy đủ chức năng giúp triển khai các tính năng được mô tả trong một hướng dẫn từng bước cụ thể. Ví dụ: thư mục /01-basic-app/ chứa phương thức triển khai cuối cùng cho hướng dẫn Tạo tiện ích bổ sung.

Nội dung thư mục

Nội dung thư mục sẽ khác nhau tuỳ thuộc vào ngôn ngữ triển khai:

Python

  • Thư mục gốc chứa các tệp sau:

    • main.py – điểm truy cập vào ứng dụng Python. Chỉ định cấu hình máy chủ mà bạn muốn sử dụng trong tệp này, rồi chạy cấu hình đó để khởi động máy chủ.
    • requirements.txt – các mô-đun Python cần có để chạy ứng dụng web. Bạn có thể cài đặt tự động các mô-đun này bằng pip install -r requirements.txt.
    • client_secret.json – tệp mật khẩu ứng dụng khách được tải xuống từ Google Cloud. Xin lưu ý rằng tệp này không có trong kho lưu trữ mẫu; bạn nên đổi tên và sao chép tệp thông tin xác thực đã tải xuống vào từng gốc thư mục.

  • config.py – tuỳ chọn cấu hình cho máy chủ Flask.

  • Thư mục webapp chứa nội dung dành cho ứng dụng web. Gói này bao gồm những công cụ sau:

  • Thư mục /templates/ có các mẫu Jinja cho nhiều trang.

  • Thư mục /static/ có hình ảnh, CSS và các tệp JavaScript phụ trợ.

  • routes.py – các phương thức trình xử lý cho các tuyến của ứng dụng web.

  • __init__.py – trình khởi tạo cho mô-đun webapp. Trình khởi động này sẽ khởi động máy chủ Flask và tải các tuỳ chọn cấu hình được đặt trong config.py.

  • Các tệp bổ sung theo yêu cầu của một bước hướng dẫn cụ thể.

Node.js

Bạn có thể tìm thấy từng bước của hướng dẫn này trong thư mục con <step> riêng. Mỗi bước bao gồm:

  • Bạn có thể tìm thấy các tệp tĩnh như JavaScript, CSS và hình ảnh trong thư mục ./<step>/public.
  • Bạn có thể tìm thấy bộ định tuyến Express trong các thư mục ./<step>/routes.
  • Bạn có thể tìm thấy mẫu HTML trong các thư mục ./<step>/views.
  • Ứng dụng máy chủ là ./<step>/app.js.

Java

Thư mục dự án bao gồm:

  • Thư mục src.main chứa mã nguồn và cấu hình để chạy ứng dụng thành công. Thư mục này bao gồm những phần sau: + Thư mục java.com.addons.spring chứa các tệp Application.javaController.java. Tệp Application.java chịu trách nhiệm chạy máy chủ ứng dụng trong khi tệp Controller.java xử lý logic điểm cuối. + Thư mục resources chứa thư mục templates gồm các tệp HTML và JavaScript. Tệp này cũng chứa tệp application.properties chỉ định cổng để chạy máy chủ, đường dẫn đến tệp kho khoá và đường dẫn đến thư mục templates. Ví dụ này bao gồm tệp kho khoá trong thư mục resources. Bạn có thể lưu trữ tệp này ở bất cứ nơi nào bạn muốn, nhưng hãy nhớ cập nhật tệp application.properties bằng đường dẫn phù hợp.
    • pom.xml chứa thông tin cần thiết để xây dựng dự án và xác định các phần phụ thuộc bắt buộc.
    • .gitignore chứa tên tệp không được tải lên git. Hãy đảm bảo rằng bạn thêm đường dẫn vào kho khoá của mình trong .gitignore này. Trong ví dụ được cung cấp, đây là secrets/*.p12 (mục đích của kho khoá sẽ được thảo luận trong phần dưới đây). Đối với hướng dẫn từng bước 2 và các phiên bản khác, bạn cũng nên cung cấp đường dẫn đến tệp client_secret.json để đảm bảo rằng bạn không đưa các khoá bí mật của mình vào kho lưu trữ từ xa. Đối với hướng dẫn từng bước 3 trở lên, bạn nên thêm đường dẫn vào tệp cơ sở dữ liệu H2 và nhà máy kho dữ liệu của tệp. Bạn có thể tìm thêm thông tin về cách thiết lập các kho dữ liệu này trong hướng dẫn từng bước thứ ba về cách xử lý các lượt truy cập lặp lại.
    • mvnwmvnw.cmd lần lượt là các tệp thực thi trình bao bọc Maven dành cho Unix và Windows. Ví dụ: việc chạy ./mvnw --version trên Unix sẽ tạo ra phiên bản Apache Maven và nhiều thông tin khác.
    • Thư mục .mvn chứa cấu hình cho trình bao bọc Maven.

Chạy máy chủ mẫu

Bạn cần khởi chạy máy chủ của mình để kiểm thử. Hãy làm theo hướng dẫn sau để chạy máy chủ mẫu bằng ngôn ngữ bạn chọn:

Python

Thông tin đăng nhập OAuth

Tạo và tải thông tin đăng nhập OAuth xuống như mô tả trước đó. Đặt tệp JSON vào thư mục gốc cùng với tệp chạy máy chủ của ứng dụng.

Định cấu hình máy chủ

Bạn có một số lựa chọn để chạy máy chủ web. Ở cuối tệp Python, hãy thêm một trong các đoạn mã sau:

  1. localhost không an toàn. Xin lưu ý rằng phương thức này chỉ phù hợp để kiểm thử trực tiếp trong cửa sổ trình duyệt. Bạn sẽ không thể tải các miền không bảo mật trong iframe tiện ích bổ sung của Lớp học.

    if __name__ == "__main__":
      # Disable OAuthlib's HTTPs verification.
      os.environ["OAUTHLIB_INSECURE_TRANSPORT"] = "1"
    
      # Run the web app at http://localhost:5000.
      app.run(debug=True)
    
  2. Bảo mật localhost. Bạn phải chỉ định một bộ tệp khoá SSL cho đối số ssl_context.

    if __name__ == "__main__":
      # Run the web app at https://localhost:5000.
      app.run(host="localhost",
              ssl_context=("localhost.pem", "localhost-key.pem"),
              debug=True)
    
  3. Gunicorn. Giải pháp này phù hợp cho việc triển khai trên đám mây hoặc máy chủ sẵn sàng phát hành công khai. Bạn nên đặt biến môi trường PORT để sử dụng với tuỳ chọn khởi chạy này.

    if __name__ == "__main__":
      # Run the web app at https://<your domain>:<server_port>.
      # Defaults to https://<your domain>:8080.
      server_port = os.environ.get("PORT", "8080")
      app.run(debug=True, port=server_port, host="0.0.0.0")
    

Khởi chạy máy chủ

Chạy ứng dụng Python để chạy máy chủ như đã định cấu hình trong bước trước.

python main.py

Nhấp vào URL xuất hiện để xem ứng dụng web của bạn trong trình duyệt và xác nhận rằng ứng dụng đó đang chạy đúng cách.

Node.js

Định cấu hình máy chủ

Để chạy máy chủ qua HTTPS, bạn cần tạo một chứng chỉ tự chứng nhận dùng để chạy ứng dụng qua HTTPS. Các thông tin xác thực này phải được lưu dưới dạng sslcert/cert.pemsslcert/key.pem trong thư mục gốc của kho lưu trữ. Có thể bạn cần thêm các khoá này vào chuỗi khoá hệ điều hành để trình duyệt chấp nhận các khoá đó.

Hãy đảm bảo rằng *.pem nằm trong tệp .gitignore vì bạn không muốn xác nhận tệp này vào git.

Khởi chạy máy chủ

Bạn có thể chạy ứng dụng bằng lệnh sau thay thế step01 cho bước chính xác mà bạn muốn chạy dưới dạng máy chủ (ví dụ: step01 cho ứng dụng 01 cơ bản và step02 cho đăng nhập 02).

npm run step01

hoặc

npm run step02

Thao tác này sẽ khởi chạy máy chủ web tại https://localhost:5000.

Bạn có thể chấm dứt máy chủ bằng Control + C trong dòng lệnh.

Java

Định cấu hình máy chủ

Để chạy máy chủ qua HTTPS, bạn cần tạo một chứng chỉ tự chứng nhận dùng để chạy ứng dụng qua HTTPS.

Hãy cân nhắc sử dụng mkcert để phát triển cục bộ. Sau khi bạn cài đặt mkcert, các lệnh sau sẽ tạo một chứng chỉ được lưu trữ cục bộ để chạy qua HTTPS.

mkcert -install
mkcert -pkcs12 -p12-file <path_to_keystore> <domain_name>

Ví dụ này bao gồm tệp kho khoá trong thư mục tài nguyên. Bạn có thể lưu trữ tệp này ở bất cứ nơi nào bạn muốn, nhưng hãy nhớ cập nhật tệp application.properties bằng đường dẫn phù hợp. Tên miền là miền mà bạn chạy dự án (ví dụ: localhost).

Hãy đảm bảo rằng *.p12 nằm trong tệp .gitignore vì bạn không muốn xác nhận tệp này vào git.

Khởi chạy máy chủ

Chạy máy chủ bằng cách chạy phương thức main trong tệp Application.java. Ví dụ: Trong IntelliJ, bạn có thể nhấp chuột phải vào Application.java > Run 'Application' trong thư mục src/main/java/com/addons/spring hoặc mở tệp Application.java để nhấp vào mũi tên màu xanh lục ở bên trái chữ ký phương thức main(String[] args). Ngoài ra, bạn có thể chạy dự án trong một cửa sổ dòng lệnh:

./mvnw spring-boot:run

hoặc trên Windows:

mvnw.cmd spring-boot:run

Thao tác này sẽ khởi chạy máy chủ tại https://localhost:5000 hoặc tại cổng mà bạn đã chỉ định trong application.properties.