Xác thực và uỷ quyền

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

Tổng quan

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

Fleet Engine cũng nhận được các lệnh gọi bắt nguồn từ môi trường 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, phần phụ trợ của khách hàng cần tạo Mã thông báo web JSON đã ký (JWT) kèm theo những thông báo bổ sung dành riêng cho Fleet Engine, sau đó có thể được cấp cho 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 đây.

  • Vai trò IAM xác định một tập hợp các quyền đối với các tài nguyên được phép cho một hiệu trưởng. 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ò Trình điều khiển không đáng tin cậy* chỉ được phép cập nhật vị trí 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, tuyên bố JWT sẽ hạn chế hơn nữa các thực thể mà phương thức gọi có thể hoạt động. Đó có thể là những nhiệm vụ cụ thể hoặc phương tiện giao hàng.

  • Trước tiên, mã của bạn chạy trong môi trường tin cậy thấp phải gọi trên mã đang chạy trong môi trường đáng tin cậy để phát hành JWT.

  • Fleet Engine 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. Hiệu trưởng gọi 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ị, các thông báo xác nhận quyền sở hữu JWT được chuyển vào 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.

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

  2. Quản trị viên hệ thống thiết bị chỉ định vai trò IAM cụ thể cho các tài khoản dịch vụ.

  3. Quản trị viên nhóm thiết bị định cấu hình phần phụ trợ bằng tài khoản dịch vụ và Thông tin đăng nhập mặc định của ứng dụng.

  4. Ứng dụng khách yêu cầu 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. Phần phụ trợ của khách hàng sẽ ký và đưa ra 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 các 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 trên đám mây

Để 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 Google Cloud Console.
  2. Sử dụng Trang tổng quan các API và dịch vụ, bật API Dịch vụ gọi xe và giao hàng địa phương.

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

Tài khoản dịch vụ là một loại tài khoản đặc biệt mà ứng dụng sử dụng chứ không phải người. Thông thường, tài khoản dịch vụ được dùng để đúc các JWT cấp các 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ó một 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 tài xế đáng tin cậy của Fleet Engine Delivery

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

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 tài khoản dịch vụ tạo có vai trò này thường được dùng trên thiết bị di động của tài xế giao hàng.
Người dùng Fleet Engine Delivery

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ụ tạo có vai trò này thường được dùng từ trình duyệt web của người dùng phân phối.
Quản trị viên Fleet Engine Delivery

roles/fleetengine.deliveryAdmin
Cấp quyền đọc và ghi đối với các tài nguyên phân phối. Người dùng chính có vai trò này không cần sử dụng JWT và thay vào đó, họ nên 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. Vai trò này chỉ nên được cung cấp cho các môi trường đáng tin cậy (phần phụ trợ của khách hàng).
Siêu người dùng Fleet Engine Delivery **(KHÔNG DÙNG NỮA)**

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

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

Những tổ chức cung cấp thiết bị do bộ phận CNTT doanh nghiệp quản lý có thể tận dụng tính linh hoạt của vai trò Người dùng tài xế đáng tin cậy của Fleet Engine và chọn tích hợp một số hoặc tất cả tương tác của Fleet Engine trong ứ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 tài xế không tin cậy của Fleet Engine, đồng thời chỉ dựa vào ứng dụng di động để gửi thông tin cập nhật vị trí của xe đến Fleet Engine. Tất cả các lượt tương tác khác phải bắt nguồn từ các máy chủ phụ trợ của khách hàng.

SDK 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ò 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 tiêu dùng sẽ hiển thị thông báo lỗi khi thiếu một quyền cần thiết. Do đó, bạn nên sử dụng nhóm vai trò chuẩn nêu 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 Vai trò thả xuống, hãy chọn Fleet Engine rồi 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 mộ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 những khách hàng không đáng tin cậy, hãy thêm người dùng vào Vai trò người tạo mã thông báo của tài khoản dịch vụ để họ có thể đú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 các môi trường không đáng tin cậy. Thư viện xác thực Fleet Engine Auth, có sẵn trên GitHub, giúp đơn giản hoá việc xây dựng JWT Fleet Engine và ký tên một cách an toàn.

Thư viện mang lại những lợi ích sau:

  • Đơn giản hoá quy trình tạo Mã thông báo Fleet Engine.
  • Cung cấp 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, bạn cần tạo JWT trực tiếp trong cơ sở mã của mình. Để làm được như vậy, bạn phải hiểu rõ về JWT cũng như 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 các thiết bị chỉ có thể sửa đổi các phương tiện hoặc tác vụ đượ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, những dịch vụ mà mã thông báo đang xác nhận quyền truy cập và các thông tin uỷ quyền khác để giảm phạm vi truy cập; ví dụ: mã xe phân phối.

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

Kỹ thuậtNội dung mô tả
alg Thuật toán cần sử dụng. "RS256".
typ Loại mã thông báo. "JWT".
kid 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 trong tài khoản dịch vụ. Hãy nhớ sử dụng khoá trong một tài khoản dịch vụ có cấp độ quyền phù hợp.

Phần thông báo 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.
aud SERVICE_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ã thông báo được tạo, được chỉ định bằng giây đã trôi qua kể từ 00:00:00 giờ UTC, ngày 1 tháng 1 năm 1970. Chờ 10 phút để xiên. Nếu dấu thời gian quá xa trong quá khứ hoặc trong tương lai, thì có thể máy chủ sẽ 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 đã trôi qua kể từ 00:00:00 giờ 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 là hơn một giờ trong tương lai.
authorization Tuỳ thuộc vào trường hợp sử dụng, có thể chứa "deliveryvehicleid", "trackingid", "taskid" hoặc "taskids".

Việc đúc mã thông báo JWT tức là ký mã thông báo đó. Để biết hướng dẫn và mã mẫu để tạo và ký JWT, hãy xem phần Uỷ quyền tài khoản dịch vụ không cần OAuth. Sau đó, bạn có thể đính kèm một mã thông báo đã tạo 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.

Thông báo xác nhận quyền sở hữu JWT

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

Giải pháp Last Mile Fleet sử dụng các tuyên bố riêng tư sau đây:

  • deliveryvehicleid – sử dụng khi gọi API mỗi xe phân phối.
  • taskid – sử dụng khi gọi API cho 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à 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 các 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 bao gồm thông báo xác nhận quyền sở hữu delivervehicleid, taskid hoặc taskids.

Mã thông báo cũng phải chứa thông báo xác nhận quyền sở hữu thích 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 thông báo 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 thông báo xác nhận quyền sở hữu taskids, nhưng đó 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 phương thức 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ụ 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 mang tải có giá trị là mã thông báo, như đã nêu trong ghi chú uỷ quyền cho từng trường hợp sử dụng tính năng theo dõi quá trình vận chuyển hoặc hiệu suất sơ bộ.

Ví dụ sau đây cho thấy mã thông báo cho một thao tác theo từng tác vụ 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 một thao tác tạo tác vụ hàng loạt trên 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 một hoạt động theo từng xe phân phối từ máy chủ phụ trợ của bạn:

    {
      "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ã 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ã thông báo cho ứng dụng của 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 trong 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ụ của bạn. Bạn có thể tìm thấy giá trị này trong trường client_email của tệp JSON trong 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ã thông báo được tạo, tính bằng giây đã trôi qua kể từ 00:00:00 giờ UTC, ngày 1 tháng 1 năm 1970. Hãy chờ 10 phút để có thể xiên. Nếu dấu thời gian quá xa 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 (giờ UTC), ngày 1 tháng 1 năm 1970. Giá trị được đề xuất là iat + 3600.

Khi ký mã thông báo cần truyền tới 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ò Trình điều khiển giao hàng 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 có quyền truy cập.