Xác thực và uỷ 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 tích hợp với 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. Fleet Engine SDK yêu cầu sử dụng Mã thông báo web JSON (JWT) đã được ký bằng một Tài khoản dịch vụ thích hợp.

Tổng quan

Các phần phụ trợ của khách hàng xác thực và uỷ quyền cho Fleet Engine phải sử dụng cơ chế Thông tin xác thực mặc định của ứng dụng tiêu chuẩn.

Fleet Engine cũng nhận các lệnh gọi bắt nguồn từ các môi trường có độ tin cậy thấp, chẳng hạn như điện thoại thông minh và trình duyệt. Để bảo vệ khoá bí mật của Tài khoản dịch vụ chỉ phù hợp với các môi trường đáng tin cậy, hệ thống phụ trợ của khách hàng cần tạo mã thông báo web JSON (JWT) đã ký kèm thông báo xác nhận quyền sở hữu bổ sung dành riêng cho Fleet Engine. Sau đó, hệ thống có thể phát hành mã này tới các môi trường không đáng tin cậy như điện thoại di động.

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 một nhóm quyền đối với tài nguyên được phép đối với tên chính. Ví dụ: vai trò Quản trị viên được phép làm mọi việc với Thông tin xác thực mặc định của ứng dụng, trong khi vai trò Người lái xe không tin cậy* chỉ được phép cập nhật thông tin vị trí của xe và bị hạn chế sử dụng JWT để xác thực và uỷ quyền.

  • Đối với các môi trường không đáng tin cậy, JWT tuyên bố sẽ hạn chế hơn nữa các thực thể mà phương thức gọi có thể thao tác. Đó có thể là các nhiệm vụ hoặc xe giao hàng cụ thể.

  • Trước tiên, mã 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 đáng tin cậy để phát hành JWT.

  • Fleet Engine sẽ thực hiện các bước kiểm tra bảo mật sau đây đối với các lệnh gọi API cho một tài nguyên:

    1. Đối tượng gọi chính có các quyền thích hợp (thông qua việc chỉ định vai trò) đối với thao tác trên tài nguyên.

    2. Đối với các vai trò không phải Quản trị viên, các thông báo xác nhận quyền sở hữu JWT được chuyển đi trong yêu cầu sẽ cung cấp quyền cần thiết cho tài nguyên.

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 nhóm thiết bị sẽ định cấu hình phần phụ trợ bằng tài khoản dịch vụ và Thông tin xác thực mặc định của ứng dụng.

  4. Ứng dụng yêu cầu một JWT từ phần phụ trợ của khách hàng. 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. Bộ phận phụ trợ của khách hàng sẽ ký và 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 này 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ụ, mỗi tài khoản có bộ vai trò tối thiểu bắt buộc ().

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.
Quản trị viên phân phối của Fleet Engine<>

roles/fleetengine.deliveryAdmin
Cấp quyền đọc và ghi cho các tài nguyên phân phối. Người chính có vai trò này không cần sử dụng JWT mà nên sử dụng Thông tin xác thực mặc định của ứng dụng. Các thông báo xác nhận quyền sở hữu JWT tuỳ chỉnh sẽ bị bỏ qua. Bạn chỉ nên giới hạn vai trò này trong các môi trường đáng tin cậy (phần phụ trợ của khách hàng).
Người dùng cấp cao về phân phối công cụ của nhóm **(KHÔNG DÙNG NỮA)**

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 Fleet Engine API trong những môi trường không đáng tin cậy. Thư viện xác thực Fleet Engine, có trên GitHub, giúp đơn giản hoá quá trình tạo JWT Fleet Engine và ký các tệp báo cáo 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ụ).

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:

Kỹ thuậtNộ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:

Kỹ thuậtNộ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 GetTaskTrackingInfoAPI. 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.