Xác thực và ủy quyền

Phần này giải thích các khái niệm xác thực và uỷ quyền liên quan đến việc triển khai Fleet Engine. Hướng dẫn này trình bày chi tiết các quy trình mà bạn cần thực hiện để bảo mật các lệnh gọi hàm Fleet Engine.

Bạn có thể định cấu hình các chức năng do giải pháp Last Mile Fleet cung cấp thông qua Google Cloud Console. Những API và SDK này yêu cầu sử dụng Mã thông báo web JSON (JWT) đã được ký bằng tài khoản dịch vụ tạo từ Cloud Console.

Tổng quan

Trong cơ chế uỷ quyền, Fleet Engine giúp tăng cường bảo mật cho các lệnh gọi bắt nguồn từ môi trường có độ tin cậy thấp. Môi trường có độ tin cậy thấp bao gồm điện thoại thông minh và trình duyệt. Ngoài ra, Fleet Engine còn sử dụng Nguyên tắc về đặc quyền tối thiểu, trong đó bạn chỉ nên cấp những đặc quyền cần thiết cho lệnh gọi để hoàn thành nhiệm vụ của mình.

Để bảo vệ các lệnh gọi hàm bắt nguồn từ môi trường có độ tin cậy thấp, Google đã thiết kế một cơ chế trong đó mã của bạn tạo mã thông báo trên máy chủ phụ trợ. Đây là một môi trường hoàn toàn đáng tin cậy. Mỗi lệnh gọi đều có nội dung mô tả bảo mật đầy đủ, sau đó được mã hoá thành một JWT mà bạn truyền cùng với cuộc gọi từ bất kỳ môi trường nào.

Nguyên tắc thiết kế xác thực

Quy trình xác thực của Fleet Engine kết hợp các nguyên tắc thiết kế sau.

  • Vai trò IAM xác định phạm vi hoạt động được phép đối với phương thức gọi. Ví dụ: vai trò SuperUser được phép làm mọi việc, trong khi vai trò Người lái xe không tin cậy chỉ được phép thực hiện thao tác cập nhật vị trí ở mức tối thiểu.

  • Các vai trò IAM được liên kết với tài khoản dịch vụ.

  • JWT tuyên bố hạn chế hơn nữa các thực thể mà phương thức gọi có thể hoạt động. Đây có thể là các nhiệm vụ hoặc xe giao hàng cụ thể.

  • Các yêu cầu gửi tới Fleet Engine luôn chứa JWT.

    • Vì JWT được liên kết với tài khoản dịch vụ, nên các yêu cầu gửi đến Fleet Engine sẽ được ngầm liên kết với tài khoản dịch vụ liên kết với JWT.
  • Để yêu cầu JWT thích hợp mà bạn có thể chuyển đến Fleet Engine, trước tiên, mã của bạn chạy trong môi trường có độ tin cậy thấp phải gọi mã đang chạy trong môi trường có độ tin cậy hoàn toàn.

  • Fleet Engine sẽ thực hiện những bước kiểm tra bảo mật sau đây:

    1. Các vai trò IAM liên kết với tài khoản dịch vụ cung cấp cấp uỷ quyền chính xác để phương thức gọi thực hiện lệnh gọi API.

    2. Thông báo xác nhận quyền sở hữu JWT được truyền đi trong yêu cầu cung cấp quyền chính xác để phương thức gọi vận hành trên thực thể đó.

Quy trình xác thực

Sơ đồ trình tự sau đây minh hoạ các chi tiết về quy trình xác thực này.

  1. Quản trị viên hệ thống thiết bị sẽ tạo tài khoản dịch vụ.

  2. Quản trị viên hệ thống thiết bị sẽ chỉ định các vai trò quản lý danh tính và quyền truy cập (IAM) cụ thể cho các tài khoản dịch vụ.

  3. Quản trị viên hệ thống thiết bị sẽ định cấu hình phần phụ trợ của họ bằng các tài khoản dịch vụ.

  4. Ứng dụng khách yêu cầu một JWT từ phần phụ trợ của đối tác. Người yêu cầu có thể là ứng dụng Driver, ứng dụng Consumer hoặc ứng dụng giám sát.

  5. Fleet Engine sẽ cấp JWT cho tài khoản dịch vụ tương ứng. Ứng dụng khách nhận được JWT.

  6. Ứng dụng khách dùng JWT để kết nối với Fleet Engine nhằm đọc hoặc sửa đổi dữ liệu, tuỳ thuộc vào vai trò IAM được chỉ định cho ứng dụng trong giai đoạn thiết lập.

Sơ đồ trình tự xác thực

Thiết lập dự án Cloud

Để thiết lập dự án trên đám mây, trước tiên, hãy tạo dự án rồi tạo tài khoản dịch vụ.

Cách tạo dự án trên Google Cloud:

  1. Tạo một dự án trên Google Cloud bằng Bảng điều khiển Google Cloud.
  2. Trên Trang tổng quan về API và dịch vụ, hãy bật API Local Guides and Deliveries.

Tài khoản dịch vụ và vai trò trong IAM

Tài khoản dịch vụ là một loại tài khoản đặc biệt được ứng dụng sử dụng chứ không phải cá nhân. Thông thường, một tài khoản dịch vụ được dùng để đúc các JWT cấp những tập hợp quyền khác nhau tuỳ thuộc vào vai trò. Để giảm khả năng sử dụng sai mục đích, bạn có thể tạo nhiều tài khoản dịch vụ, trong đó mỗi tài khoản có số vai trò tối thiểu cần thiết.

Giải pháp Last Mile Fleet sử dụng các vai trò sau:

RoleNội dung mô tả
Người dùng trình điều khiển đáng tin cậy của Fleet Engine Delivery

roles/fleetengine.deliveryTrustedDriver
Cấp quyền tạo cũng như cập nhật xe giao hàng và nhiệm vụ, bao gồm cả việc cập nhật vị trí xe giao hàng cũng như trạng thái hoặc kết quả của nhiệm vụ. Mã thông báo do một tài khoản dịch vụ có vai trò này tạo thường được dùng trên thiết bị di động của người lái xe phân phối hoặc từ máy chủ phụ trợ của bạn.
Người dùng trình điều khiển không tin cậy giao hàng cho Fleet Engine

roles/fleetengine.deliveryUntrustedDriver
Cấp quyền cập nhật vị trí của xe giao hàng. Mã thông báo do một tài khoản dịch vụ có vai trò này tạo thường được sử dụng trên thiết bị di động của người lái xe giao hàng.
Người dùng giao hàng cho người tiêu dùng trong Fleet Engine

roles/fleetengine.deliveryConsumer
Cấp quyền tìm kiếm công việc bằng mã theo dõi và đọc nhưng không cập nhật thông tin công việc. Mã thông báo do tài khoản dịch vụ có vai trò này tạo thường được sử dụng trên trình duyệt web của người tiêu dùng phân phối.
Người dùng cao cấp của Fleet Engine Delivery

roles/fleetengine.deliverySuperUser
Cấp quyền cho tất cả các API nhiệm vụ và xe giao hàng. Mã thông báo do tài khoản dịch vụ có vai trò này tạo ra thường được dùng từ các máy chủ phụ trợ của bạn.
Trình đọc nhóm phương thức giao hàng cho nhóm thiết bị

roles/fleetengine.deliveryFleetReader
Cấp quyền đọc phương tiện giao hàng và nhiệm vụ, cũng như tìm kiếm công việc bằng mã theo dõi. Mã thông báo do tài khoản dịch vụ có vai trò này tạo thường được dùng trên trình duyệt web của đơn vị vận hành hệ thống thiết bị giao hàng.

Những tổ chức trang bị thiết bị do bộ phận CNTT của công ty quản lý có thể tận dụng tính linh hoạt của vai trò Người dùng trình điều khiển đáng tin cậy của Fleet Engine và chọn tích hợp một số hoặc tất cả hoạt động tương tác của Fleet Engine vào ứng dụng di động.

Các tổ chức hỗ trợ chính sách Mang thiết bị riêng của bạn nên chọn đảm bảo an toàn cho vai trò Người dùng lái xe không tin cậy của Fleet Engine và chỉ dựa vào ứng dụng di động để gửi thông tin cập nhật vị trí xe cho Fleet Engine. Tất cả các lượt tương tác khác phải bắt nguồn từ máy chủ phụ trợ của khách hàng.

SDK của trình điều khiển và SDK người tiêu dùng được xây dựng dựa trên các vai trò tiêu chuẩn này. Tuy nhiên, bạn có thể tạo vai trò tuỳ chỉnh cho phép nhóm các quyền tuỳ ý với nhau. SDK Trình điều khiển và SDK người dùng sẽ hiển thị thông báo lỗi khi thiếu quyền cần thiết. Do đó, bạn rất nên sử dụng bộ vai trò chuẩn được trình bày ở trên thay vì vai trò tuỳ chỉnh.

Tạo tài khoản dịch vụ

Bạn có thể tạo tài khoản dịch vụ bằng thẻ IAM & Admin > Service Accounts trong Google Cloud Console. Trong danh sách thả xuống Vai trò, hãy chọn Fleet Engine và chỉ định một trong các vai trò cho tài khoản dịch vụ. Bạn nên chỉ định tài khoản được liên kết với từng vai trò. Ví dụ: đặt tên có ý nghĩa cho tài khoản dịch vụ.

Để thuận tiện, nếu bạn cần đúc JWT cho các ứng dụng không đáng tin cậy, việc thêm người dùng vào Vai trò người tạo mã thông báo tài khoản dịch vụ sẽ cho phép họ đúc mã thông báo bằng công cụ dòng lệnh gcloud.

gcloud projects add-iam-policy-binding project-id \
       --member=user:my-user@example.com \
       --role=roles/iam.serviceAccountTokenCreator

Trong đó my-user@example.com là email dùng để xác thực bằng gcloud (gcloud auth list --format='value(account)').

Thư viện xác thực Fleet Engine

Fleet Engine sử dụng JWT để hạn chế quyền truy cập vào các API Fleet Engine. Thư viện xác thực Fleet Engine mới, có sẵn trên GitHub, sẽ đơn giản hóa việc xây dựng các JWT của Fleet Engine và ký các tệp đó một cách an toàn.

Thư viện mang lại các lợi ích sau:

  • Đơn giản hoá quy trình tạo Mã thông báo Fleet Engine.
  • Cung cấp các cơ chế ký mã thông báo ngoài việc sử dụng tệp thông tin xác thực (chẳng hạn như mạo danh tài khoản dịch vụ).
  • Đính kèm mã thông báo đã ký vào các yêu cầu gửi đi được thực hiện từ mã giả lập gRPC hoặc ứng dụng GAPIC.

Tạo mã thông báo web JSON (JWT) để uỷ quyền

Khi không sử dụng Thư viện xác thực Fleet Engine, JWT cần được tạo ngay trong cơ sở mã của bạn. Để làm được như vậy, bạn phải hiểu rõ về JWT và mối liên hệ của chúng với Fleet Engine. Đây là lý do bạn nên tận dụng Thư viện xác thực Fleet Engine.

Trong Fleet Engine, JWT cung cấp phương thức xác thực ngắn hạn và đảm bảo rằng thiết bị chỉ có thể sửa đổi phương tiện hoặc nhiệm vụ mà thiết bị được uỷ quyền. JWT chứa tiêu đề và phần xác nhận quyền sở hữu. Phần tiêu đề chứa các thông tin như khoá riêng tư để sử dụng (lấy từ tài khoản dịch vụ) và thuật toán mã hoá. Phần xác nhận quyền sở hữu chứa các thông tin như thời gian tạo mã thông báo, thời gian tồn tại của mã thông báo, các dịch vụ mà mã thông báo đang xác nhận quyền truy cập và thông tin uỷ quyền khác để xác định phạm vi quyền truy cập; ví dụ: mã nhận dạng phương tiện giao hàng.

Phần tiêu đề JWT chứa các trường sau:

TrườngNội dung mô tả
alg Thuật toán sử dụng. "RS256".
typ Loại mã thông báo. "JWT".
trẻ em Mã khoá riêng tư của tài khoản dịch vụ của bạn. Bạn có thể tìm thấy giá trị này trong trường "private_key_id" của tệp JSON tài khoản dịch vụ. Hãy nhớ sử dụng khoá từ một tài khoản dịch vụ có cấp quyền chính xác.

Phần xác nhận quyền sở hữu JWT chứa các trường sau:

TrườngNội dung mô tả
iss Địa chỉ email của tài khoản dịch vụ của bạn.
sub Địa chỉ email của tài khoản dịch vụ của bạn.
nghe DỊCH VỤ_NAME của tài khoản dịch vụ của bạn, trong trường hợp này là https://fleetengine.googleapis.com/
IAt Dấu thời gian khi mã được tạo, được chỉ định tính bằng giây kể từ 00:00:00 UTC, ngày 1 tháng 1 năm 1970. Chờ 10 phút để xiên. Nếu dấu thời gian quá lâu trong quá khứ hoặc trong tương lai, máy chủ có thể báo cáo lỗi.
exp Dấu thời gian khi mã thông báo hết hạn, được chỉ định bằng giây kể từ 00:00:00 UTC, ngày 1 tháng 1 năm 1970. Yêu cầu không thành công nếu dấu thời gian sau hơn 1 giờ trong tương lai.
khoản uỷ quyền Tuỳ thuộc vào trường hợp sử dụng, các thuộc tính này có thể chứa "deliveryvehicleid", "trackingid", "taskid" hoặc "taskids".

Việc đúc mã thông báo JWT nghĩa là ký mã đó. Để biết hướng dẫn và mã mẫu dùng để tạo và ký JWT, hãy xem phần Uỷ quyền tài khoản dịch vụ mà không cần OAuth. Sau đó, bạn có thể đính kèm mã thông báo đúc vào các lệnh gọi gRPC hoặc các phương thức khác dùng để truy cập vào Fleet Engine.

Tuyên bố về JWT

Giải pháp Last Mile Fleet sử dụng khiếu nại riêng tư. Việc sử dụng thông báo xác nhận quyền sở hữu riêng tư giúp đảm bảo rằng chỉ những khách hàng được uỷ quyền mới có thể truy cập vào dữ liệu của riêng họ. Ví dụ: khi phần phụ trợ của bạn phát hành Mã thông báo web JSON cho thiết bị di động của người lái xe giao hàng, mã thông báo đó phải chứa thông báo xác nhận quyền sở hữu deliveryvehicleid cùng với giá trị của mã phương tiện giao hàng của người lái xe đó. Sau đó, tuỳ thuộc vào vai trò của người lái, mã thông báo chỉ cho phép truy cập đối với mã nhận dạng xe cụ thể được phân phối chứ không phải bất kỳ mã xe tuỳ ý nào khác.

Giải pháp của Last Mile Fleet sử dụng các thông báo xác nhận quyền sở hữu riêng tư sau đây:

  • deliveryvehicleid – sử dụng khi gọi các API cho mỗi xe giao hàng.
  • taskid – sử dụng khi gọi API từng tác vụ.
  • taskids – sử dụng khi gọi BatchCreateTasksAPI. Thông báo xác nhận quyền sở hữu này phải ở dạng mảng và mảng phải chứa tất cả mã công việc cần thiết để hoàn tất yêu cầu. Không bao gồm thông báo xác nhận quyền sở hữu delivervehicleid, trackingid hoặc taskid.
  • trackingid – sử dụng khi gọi SearchTasksAPI. Thông báo xác nhận quyền sở hữu phải khớp với mã theo dõi trong yêu cầu. Không đưa thông báo xác nhận quyền sở hữu delivervehicleid, taskid hoặc taskids vào.

Mã thông báo cũng phải chứa xác nhận quyền sở hữu phù hợp khi bạn gọi API qua máy chủ phụ trợ. Tuy nhiên, bạn có thể sử dụng giá trị đặc biệt của dấu hoa thị ("*") cho các xác nhận quyền sở hữu deliveryvehicleid, taskidtrackingid. Bạn cũng có thể sử dụng dấu hoa thị ("*") trong xác nhận quyền sở hữu taskids, nhưng dấu hoa thị này phải là phần tử duy nhất trong mảng.

Nếu bạn muốn tạo và ký JSON trực tiếp dưới dạng trình mang mã thông báo, thay vì sử dụng mã truy cập OAuth 2.0, hãy đọc hướng dẫn Uỷ quyền tài khoản dịch vụ mà không cần OAuth trong tài liệu dành cho Nhà phát triển danh tính.

Cơ chế đính kèm mã thông báo vào lệnh gọi gRPC phụ thuộc vào ngôn ngữ và khung dùng để thực hiện lệnh gọi. Cơ chế chỉ định mã thông báo cho lệnh gọi HTTP là bao gồm Tiêu đề uỷ quyền với mã thông báo truy cập có giá trị là mã thông báo, như đã nêu trong ghi chú uỷ quyền cho các trường hợp sử dụng theo dõi vận chuyển hoặc hiệu suất của nhóm riêng lẻ.

Ví dụ sau đây cho thấy mã thông báo của một thao tác đồng thời từ máy chủ phụ trợ:

    {
      "alg": "RS256",
      "typ": "JWT",
      "kid": "private_key_id_of_provider_service_account"
    }
    .
    {
      "iss": "provider@yourgcpproject.iam.gserviceaccount.com",
      "sub": "provider@yourgcpproject.iam.gserviceaccount.com",
      "aud": "https://fleetengine.googleapis.com/",
      "iat": 1511900000,
      "exp": 1511903600,
      "authorization": {
         "taskid": "*"
       }
    }

Ví dụ sau đây cho thấy mã thông báo của thao tác tạo tác vụ hàng loạt từ máy chủ phụ trợ:

    {
      "alg": "RS256",
      "typ": "JWT",
      "kid": "private_key_id_of_provider_service_account"
    }
    .
    {
      "iss": "provider@yourgcpproject.iam.gserviceaccount.com",
      "sub": "provider@yourgcpproject.iam.gserviceaccount.com",
      "aud": "https://fleetengine.googleapis.com/",
      "iat": 1511900000,
      "exp": 1511903600,
      "authorization": {
         "taskids": ["*"]
       }
    }

Ví dụ sau đây cho thấy mã thông báo cho hoạt động của mỗi xe giao hàng từ máy chủ phụ trợ:

    {
      "alg": "RS256",
      "typ": "JWT",
      "kid": "private_key_id_of_provider_service_account"
    }
    .
    {
      "iss": "provider@yourgcpproject.iam.gserviceaccount.com",
      "sub": "provider@yourgcpproject.iam.gserviceaccount.com",
      "aud": "https://fleetengine.googleapis.com/",
      "iat": 1511900000,
      "exp": 1511903600,
      "authorization": {
         "deliveryvehicleid": "*"
       }
    }

Ví dụ sau đây cho thấy một mã thông báo cho khách hàng là người dùng cuối:

    {
      "alg": "RS256",
      "typ": "JWT",
      "kid": "private_key_id_of_delivery_consumer_service_account"
    }
    .
    {
      "iss": "consumer@yourgcpproject.iam.gserviceaccount.com",
      "sub": "consumer@yourgcpproject.iam.gserviceaccount.com",
      "aud": "https://fleetengine.googleapis.com/",
      "iat": 1511900000,
      "exp": 1511903600,
      "authorization": {
         "trackingid": "shipment_12345"
       }
    }

Ví dụ sau đây cho thấy một mã thông báo cho ứng dụng trình điều khiển:

    {
      "alg": "RS256",
      "typ": "JWT",
      "kid": "private_key_id_of_delivery_driver_service_account"
    }
    .
    {
      "iss": "driver@yourgcpproject.iam.gserviceaccount.com",
      "sub": "driver@yourgcpproject.iam.gserviceaccount.com",
      "aud": "https://fleetengine.googleapis.com/",
      "iat": 1511900000,
      "exp": 1511903600,
      "authorization": {
         "deliveryvehicleid": "driver_12345"
       }
    }
  • Đối với trường kid trong tiêu đề, hãy chỉ định mã khoá riêng tư của tài khoản dịch vụ. Bạn có thể tìm thấy giá trị này trong trường private_key_id của tệp JSON cho tài khoản dịch vụ.
  • Đối với các trường isssub, hãy chỉ định địa chỉ email của tài khoản dịch vụ. Bạn có thể tìm thấy giá trị này trong trường client_email của tệp JSON tài khoản dịch vụ.
  • Đối với trường aud, hãy chỉ định https://SERVICE_NAME/.
  • Đối với trường iat, hãy chỉ định dấu thời gian khi mã được tạo, tính bằng giây kể từ 00:00:00 giờ UTC, ngày 1 tháng 1 năm 1970. Chờ 10 phút để lệch. Nếu dấu thời gian quá lâu trong quá khứ hoặc trong tương lai, thì máy chủ có thể báo cáo lỗi.
  • Đối với trường exp, hãy chỉ định dấu thời gian khi mã thông báo hết hạn, tính bằng giây kể từ 00:00:00 UTC, ngày 1 tháng 1 năm 1970. Bạn nên sử dụng giá trị iat + 3600.

Khi ký mã thông báo sẽ được truyền đến một thiết bị di động hoặc người dùng cuối, hãy nhớ sử dụng tệp thông tin xác thực cho vai trò Người điều khiển phân phối hoặc Người tiêu dùng. Nếu không, thiết bị di động hoặc người dùng cuối sẽ có thể thay đổi hoặc xem thông tin mà họ không nên có quyền truy cập.