驗證及授權

本節說明 Google Cloud 的驗證與授權概念 與 Fleet Engine 的整合。

您可以透過以下方式設定 Last Mile Fleet Solution 提供的功能: Google Cloud 控制台。Fleet Engine SDK 必須使用由 Google 伺服器簽署的 JSON Web Token (JWT) 適當的服務 帳戶

總覽

驗證及授權 Fleet Engine 的客戶後端應使用 標準應用程式預設值 憑證 機制

Fleet Engine 也會接收來自低信任環境的呼叫 如智慧型手機和瀏覽器只保護服務帳戶密鑰 適合受信任的環境並預期會產生 已簽署 JSON Web Token (JWT),以及 Fleet Engine 專屬的額外憑證附加資訊 然後再發送至不信任的環境,例如手機

驗證設計原則

Fleet Engine 的驗證流程包含下列設計原則。

  • IAM 角色定義了 對主體允許的資源取得一組權限舉例來說, 管理員角色可透過應用程式預設設定執行所有動作 憑證,「不受信任的驅動程式*」角色只能更新 車輛位置,且僅限使用 JWT 進行驗證和 或授權。

  • 針對不受信任的環境,JWT 憑證附加資訊會進一步限制 呼叫端可能已開啟。可以是特定任務或運輸車輛。

  • 在低信任環境中執行的程式碼必須先呼叫 ,以發出 JWT。

  • Fleet Engine 會對 資源:

    1. 呼叫主體具備適當權限 (透過角色) 指派)。

    2. 對於非管理員角色者,要求中傳遞的 JWT 憑證附加資訊可提供 必要的資源權限。

驗證流程

以下序列圖表展示這些驗證流程的詳細資料。

  1. 機群管理員會建立服務帳戶

  2. 機群管理員會為服務帳戶指派特定 IAM 角色。

  3. 機群管理員透過服務帳戶設定後端 和應用程式預設憑證

  4. 用戶端應用程式向客戶後端要求 JWT。要求者可以 可能是「駕駛」應用程式、消費者應用程式或監控應用程式

  5. 客戶後端簽署並發出各項服務的 JWT 讓他們使用服務帳戶用戶端應用程式收到 JWT。

  6. 用戶端應用程式使用 JWT 連線至 Fleet Engine,以便讀取或修改 資料,具體取決於在設定階段獲派的 IAM 角色。

驗證序列圖表

Cloud 專案設定

如要設定雲端專案,請先建立專案,然後 可以建立服務帳戶

如要建立 Google Cloud 專案,請按照下列步驟操作:

  1. 使用 Google Cloud 控制台建立 Google Cloud 專案。
  2. 使用 API 和服務資訊主頁 Local Rides and Deliveries API。

服務帳戶IAM 角色

服務帳戶 應用程式 (而非使用者) 使用的特殊帳戶。 一般而言,服務帳戶可用來建立授予不同 取決於角色降低濫用的可能性 您可以建立多個服務帳戶 必要 ()。

Last Mile Fleet Solution 使用下列角色:

角色說明
Fleet Engine Delivery 受信任驅動程式使用者

roles/fleetengine.deliveryTrustedDriver
可授予建立及更新運輸車輛和工作的權限。 包括更新交車地點和工作狀態 或是結果具有這個角色的服務帳戶建立的權杖數量 通常用於送貨司機的行動裝置 您的後端伺服器
不受信任的 Fleet Engine Delivery 駕駛員使用者

roles/fleetengine.deliveryUntrustedDriver
可授予更新送貨車位置的權限。建立的權杖數量 由具備這個角色的服務帳戶 通常會透過您的交付項目 驅動程式的行動裝置。
Fleet Engine Delivery 一般使用者

roles/fleetengine.deliveryConsumer
可使用追蹤 ID 搜尋工作 以及讀取但不更新工作資訊建立的權杖數量 由具備這個角色的服務帳戶 通常會透過提交項目 。
Fleet Engine Delivery 管理員

roles/fleetengine.deliveryAdmin
授予交付資源的讀取和寫入權限。校長 具有這個角色的使用者不需要使用 JWT,而是應該改用 Application 。系統會忽略自訂 JWT 憑證附加資訊。這個角色應 僅限受信任的環境 (客戶後端) 使用。
Fleet Engine Delivery 超級使用者 **(已淘汰)**

roles/fleetengine.deliverySuperUser
授予所有推送車輛和工作 API 的權限。建立的權杖數量 由具備這個角色的服務帳戶 通常會從後端使用 伺服器
Fleet Engine Delivery 機群讀取者

roles/fleetengine.deliveryFleetReader
授予讀取運送車輛和工作及搜尋 處理透過追蹤 ID 完成的工作服務帳戶透過此項目建立的憑證 角色通常用於運送機群業者的網路瀏覽器。

透過 Google Cloud 管理的裝置提供送貨司機, 企業 IT 人員則可利用 Fleet Engine 的靈活性 「信任的驅動程式使用者」角色,並選擇整合部分或所有 Fleet Engine 行動應用程式中的互動

支援「自攜裝置政策」的機構應選擇 是否完全仰賴 Fleet Engine 不受信任的駕駛使用者角色 將車輛位置更新資訊傳送至 Fleet Engine所有其他 互動應源自於客戶的後端伺服器。

驅動程式和消費者 SDK 是根據這些標準角色建構而成。 不過,您可以建立自訂角色 可組合任何一組權限 駕駛和消費者 SDK 會在 缺少必要權限。因此,我們強烈建議 請使用上述的標準角色組合,而非自訂角色。

建立服務帳戶

您可以使用 IAM & Admin > Service Accounts 建立服務帳戶 開啟 Cloud 控制台在「角色」下拉式清單中選取 並為服務帳戶指派其中一個角色。很好 ,指出與各個角色相關聯的帳戶。 例如,為服務帳戶提供有意義的名稱。

為了方便起見,如果您需要為不受信任的用戶端建立 JWT,將 授予服務帳戶權杖建立者角色的使用者,讓對方能夠取得權杖 使用 gcloud 指令列工具進行操作。

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

其中 my-user@example.com 是用於以下敘述的電子郵件: 透過 gcloud 進行驗證 (gcloud auth list --format='value(account)')。

Fleet Engine 驗證程式庫

Fleet Engine 使用 JWT 限制對不受信任 Fleet Engine API 的存取權 環境Fleet Engine 驗證程式庫 GitHub 能簡化 建構的 Fleet Engine JWT 並以安全的方式簽署。

這個程式庫提供以下優點:

  • 簡化建立 Fleet Engine 權杖的程序。
  • 提供使用憑證檔案以外的憑證簽署機制 (例如 模擬服務帳戶)

建立授權的 JSON Web Token (JWT)

不使用 Fleet Engine 驗證程式庫時,您必須建立 JWT 直接在程式碼集中處理為此,您必須同時具備 瞭解 JWT 及其與 Fleet Engine 之間的關係。正因如此 強烈建議您使用 Fleet Engine 驗證程式庫。

在 Fleet Engine 中,JWT 提供短期驗證 確保您的裝置只能修改車輛或工作 取得與授權相關的憑證JWT 含有標頭和憑證附加資訊區段。 header 區段則包含 要使用的私密金鑰 (由服務帳戶取得) 和加密功能 演算法。著作權聲明部分包含 權杖的建立時間、權杖的存留時間、權杖所屬的服務 主張存取權,以及要限定範圍的其他授權資訊 存取;例如運送車輛 ID

JWT 標頭區段包含下列欄位:

欄位說明
alg 要使用的演算法。`RS256`。
typ 權杖類型。「JWT」。
kid 服務帳戶的私密金鑰 ID。您可以在 服務帳戶 JSON 檔案的「private_key_id」欄位中 請務必使用具備正確權限層級的服務帳戶金鑰。

JWT 憑證附加資訊區段包含下列欄位:

欄位說明
iss 服務帳戶的電子郵件地址。
sub 服務帳戶的電子郵件地址。
aud 服務帳戶的 SERVICE_NAME,在本範例中為 https://fleetengine.googleapis.com/
iat 權杖建立時間的時間戳記 (從過去幾秒內指定) ,時間為世界標準時間 1970 年 1 月 1 日 00:00:00請等候 10 分鐘,讓系統進行偏差。如果 時間戳記距離現在太久,或在未來,伺服器可能會回報錯誤。
exp 權杖到期時間的時間戳記 (以秒數為單位) ,時間為世界標準時間 1970 年 1 月 1 日 00:00:00如果時間戳記為 未來一小時以上。
authorization 視用途而定,可能包含 `deliveryvehicleid`、`trackingid`、`taskid` 或 `taskids`。

建立 JWT 權杖就是進行簽署。如需操作說明和程式碼範例 如需建立及簽署 JWT,請參閱 不使用 OAuth 的服務帳戶授權。 接著,您可以將建立的憑證附加至 gRPC 呼叫,或附加至其他使用的方法 存取 Fleet Engine。

JWT 憑證附加資訊

Last Mile Fleet Solution 使用私人憑證附加資訊。使用私人著作權聲明能確保 授權客戶存取自己的資料舉例來說 核發 JSON Web Token 給運送驅動程式的行動裝置,該憑證 包含 deliveryvehicleid 聲明及其貨品交付的價值 車輛 ID。然後視驅動程式角色而定,權杖只會為以下項目授予存取權: 特定的提交車輛 ID,而非任何其他任意車輛 ID。

Last Mile Fleet Solution 使用下列私人索賠:

  • deliveryvehicleid - 呼叫每送車 API 時使用。
  • taskid:呼叫個別工作的 API 時使用。
  • taskids:呼叫 BatchCreateTasksAPI 時使用。此著作權聲明必須 而陣列應包含 來完成要求請勿加入 delivervehicleidtrackingidtaskid 項著作權聲明。
  • trackingid:呼叫 GetTaskTrackingInfoAPI 時使用。聲明必須 與要求中的追蹤 ID 相符。請勿加入「delivervehicleidtaskidtaskids 項著作權聲明。

當您呼叫 API 時,憑證也必須包含適當的憑證附加資訊 但您可以使用星號標示的特殊值 (「*」) 代表 deliveryvehicleidtaskidtrackingid 著作權聲明。星號 「*」也可以用在 taskids 聲明中,但必須是唯一元素 。

若您想要直接建立並簽署 JSON 做為符記不記名, 請閱讀 不使用 OAuth 的服務帳戶授權

將權杖附加至 gRPC 呼叫的機制會因語言而異 以及用於發出呼叫的架構用來指定權杖的機制 是在 HTTP 呼叫中加入 Authorization 標頭和不記名權杖 其值是權杖,如個人授權附註中所述 運送追蹤機群效能 具體來說,您可以設計提示來解決業務工作

以下範例顯示執行個體中各項工作作業的權杖 後端伺服器:

    {
      "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": "*"
       }
    }

以下範例顯示了 後端伺服器:

    {
      "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": ["*"]
       }
    }

以下範例顯示每個遞送車輛作業的符記 您好:

    {
      "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": "*"
       }
    }

以下範例顯示使用者客戶的權杖:

    {
      "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"
       }
    }

以下範例顯示驅動程式應用程式的權杖:

    {
      "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"
       }
    }
  • 針對標頭中的 kid 欄位,指定服務帳戶的不公開項目 金鑰 ID。您可以在private_key_id 服務帳戶 JSON 檔案
  • isssub 欄位中,指定服務帳戶的電子郵件地址。 您可以在服務帳戶的 client_email 欄位中找到這個值 JSON 檔案
  • aud 欄位中,指定 https://SERVICE_NAME/
  • iat 欄位中,指定權杖建立時間的時間戳記。 (以秒為單位)。允許 10 分鐘 偏見如果時間戳記過於過去或未來的時間, 伺服器可能會回報錯誤。
  • exp 欄位中,指定符記到期的時間戳記。 以秒為單位。建議值 為 iat + 3600。

簽署要傳遞至行動裝置或使用者的權杖時,請確認 使用「交付驅動程式」或「消費者」角色的憑證檔案。否則 行動裝置或使用者都可以變更或檢視 不讓任何人存取的資訊