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 bằng về 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 Bảng điều khiển Google Cloud. SDK động cơ nhóm yêu cầu sử dụng Mã thông báo web JSON (JWT) được ký bằng dịch vụ phù hợp Tài khoản.

Tổng quan

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

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. Chỉ bảo vệ các khoá bí mật của Tài khoản dịch vụ phù hợp với các môi trường đáng tin cậy, hệ thống phụ trợ dự kiến sẽ tạo ra đã ký Mã thông báo web JSON (JWT) kèm theo thông báo xác nhận quyền sở hữu bổ sung dành riêng cho Fleet Engine sau đó có thể được phát hành 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 đây.

  • Vai trò IAM xác định một nhóm quyền đối với các tài nguyên được phép cho một đối tượng chính. Ví dụ: Vai trò Quản trị viên được phép làm mọi việc nhờ chế độ Mặc định của ứng dụng Thông tin đăng nhập, trong khi vai trò Người lái xe không đáng tin cậy* chỉ được phép cập nhật 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ể 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 đáng tin cậy thấp phải gọi trên mã 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 đối với các lệnh gọi API cho một tài nguyên:

    1. Người gọi điện có các quyền thích hợp (thông qua vai trò) giao) cho hành động đối với 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 trong yêu cầu 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 hệ thống 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 xác thực 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ể 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 ký và đưa ra JWT cho dịch vụ tương ứng tài khoản. Ứ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 dữ liệu đó 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 sau đó 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 API và dịch vụ, bật API hỗ trợ gọi xe và giao hàng tại đị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 được ứng dụng sử dụng, thay vì cá nhân. Thông thường, tài khoản dịch vụ được dùng để đúc các JWT khác nhau các nhóm quyền tùy thuộc vào vai trò. Để giảm khả năng hành vi sai trái bạn có thể tạo nhiều tài khoản dịch vụ, mỗi tài khoản có một nhóm 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:

Vai trò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 xe cũng như nhiệm vụ giao hàng, bao gồm cả việc cập nhật vị trí của xe giao hàng và trạng thái nhiệm vụ hoặc kết quả. 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 thiết bị di động của tài xế giao hàng hoặc từ các máy chủ phụ trợ của bạn.
Người dùng tài xế không tin cậy việc phân phối công cụ của Fleet Engine

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

roles/fleetengine.deliveryConsumer
Cấp quyền tìm kiếm công việc bằng cách sử dụng mã theo dõi, và đọc nhưng không cập nhật thông tin công việc. Số mã thông báo đã tạo bởi tài khoản dịch vụ có vai trò này thường được sử dụng trong trình duyệt web của người tiêu dùng.
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. Hiệu trưởng với vai trò này không cần sử dụng JWT mà thay vào đó nên sử dụng Application Thông tin xác thực mặc định. 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 phải là chỉ dành 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. Số mã thông báo đã tạo bởi tài khoản dịch vụ có vai trò này thường được sử dụng từ chương trình phụ trợ của bạn máy chủ.
Người đọc thiết bị phân phối thiết bị

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

Các tổ chức trang bị tài xế giao hàng bằng thiết bị được quản lý bằng bộ phận CNTT của doanh nghiệp có thể tận dụng tính linh hoạt của Fleet Engine Vai trò Người lái xe đáng tin cậy và chọn tích hợp một số hoặc tất cả Fleet Engine số lượt tương tác trong ứng dụng dành cho thiết bị di động.

Các tổ chức hỗ trợ chính sách Sử dụng thiết bị của riêng bạn nên chọn sự an toàn của vai trò Người dùng tài xế 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 đến Fleet Engine. Tất cả giá trị khác các lượt tương tá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 vẫ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à 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 bằng cách 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 một tài khoản dịch vụ bằng IAM & Admin > Service Accounts trong Google Cloud Console. Trong danh sách Vai trò thả xuống, hãy chọn Fleet Engine và chỉ định một trong các vai trò cho tài khoản dịch vụ. Tốt để chỉ ra tài khoản được liên kết với mỗi 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 các ứng dụng không đáng tin cậy, hãy thêm vai trò người tạo mã thông báo của tài khoản dịch vụ 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 được 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 trường hợp không đáng tin cậy môi trường xung quanh. Thư viện xác thực Fleet Engine, có trên GitHub, đơn giản hoá xây dựng Fleet Engine JWT 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 một 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 công cụ Fleet, JWT cần phải trực tiếp tạo trong cơ sở mã của bạn. Để làm được điều này, bạn cần phải có cả hiểu biết về JWT và mối liên hệ của chúng với Fleet Engine. Đây là lý do chúng tôi Bạn đặc biệt nên tận dụng Thư viện xác thực công cụ Fleet.

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 xe hoặc nhiệm vụ cho mà họ được phép. JWT chứa tiêu đề và phần xác nhận quyền sở hữu. Phần tiêu đề có chứa thông tin như khoá riêng tư để sử dụng (lấy từ tài khoản dịch vụ) và mã hoá thuật toán. Phần xác nhận quyền sở hữu có chứa những 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 đó xác nhận quyền truy cập vào và thông tin uỷ quyền khác để thu hẹp phạm vi truy cập; ví dụ: mã xe giao hàng.

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

TrườngMô 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:

TrườngMô 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, nên 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 xác đị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 đó. Để xem hướng dẫn và mã mẫu để tạo và ký JWT, hãy xem 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 được sử dụng để truy cập 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ư giúp đảm bảo rằng chỉ khách hàng được uỷ quyền 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 tài xế giao hàng, mã thông báo đó sẽ chứa xác nhận quyền sở hữu deliveryvehicleid với giá trị giao hàng của tài xế đó mã 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 cho mã xe cụ thể mà bạn cung cấp chứ không phải 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. Khiếu nại 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 delivervehicleid, trackingid hoặc taskid thông báo xác nhận quyền sở hữu.
  • trackingid – sử dụng khi gọi GetTaskTrackingInfoAPI. Khiếu nại phải khớp với mã theo dõi trong yêu cầu. Không bao gồm delivervehicleid, taskid hoặc taskids thông báo xác nhận quyền sở hữu.

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 từ máy chủ phụ trợ, nhưng bạn có thể sử dụng giá trị đặc biệt của dấu hoa thị ("*") cho các thông báo xác nhận quyền sở hữu deliveryvehicleid, taskidtrackingid. Dấu hoa thị ("*") cũng có thể được sử dụng trong thông báo xác nhận quyền sở hữu taskids nhưng phải là thành phần 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 chứa mã thông báo, thay vì bằng mã truy cập OAuth 2.0, hãy đọc hướng dẫn về Uỷ quyền tài khoản dịch vụ không cần OAuth trong tài liệu về 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 sẽ 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 đối với lệnh gọi HTTP là bao gồm tiêu đề Uỷ quyền cùng với mã thông báo mang có giá trị là mã thông báo, như được ghi chú trong ghi chú uỷ quyền cho người dùng cá nhân theo dõi quá trình vận chuyển hoặc hiệu suất thoáng qua các trường hợp sử dụng.

Ví dụ sau đây trình bà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 cho 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ợ 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 chế độ riêng tư cho tài khoản dịch vụ của bạn mã khoá. Bạn có thể tìm thấy giá trị này trong trường private_key_id của tệp JSON của 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ài khoản dịch vụ Tệp JSON.
  • Đố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 tạo mã thông bá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. Chờ 10 phút độ lệch. Nếu dấu thời gian là quá xa trong quá khứ hoặc trong tương lai, 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 chuyển cho một thiết bị di động hoặc người dùng cuối, hãy đảm bảo để 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 hay 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.