認証と承認

このセクションでは、Google Cloud による認証と認可の Fleet Engine との統合に関して もう少し詳しく説明します

Last Mile Fleet Solution が提供する機能は、 Google Cloud コンソールFleet Engine SDK アプリケーションによって署名された JSON Web Token(JWT)を 適切なサービス アカウント

概要

お客様のバックエンドで Fleet Engine に対する認証と認可を行う場合は、 標準アプリケーションのデフォルト クルデンシャル メカニズムです。

Fleet Engine は、信頼性の低い環境から発信された呼び出しも受信する スマートフォンやブラウザなどですサービス アカウントの秘密鍵のみを保護するには アプリケーションに適しています。生成されることが予想されます。 Fleet Engine 固有の追加クレームを含む署名付き JSON ウェブトークン(JWT) スマートフォンなどの信頼できない環境に発行できます。

認証の設計原則

Fleet Engine の認証フローには、次の設計原則が組み込まれています。

  • IAM ロールは、 リソースに対する権限のセット。たとえば、 管理者ロールは、アプリケーションのデフォルトに関してすべての操作を実行できる 認証情報(信頼されていないドライバー* ロールは更新のみ可能) 車両の位置情報であり、認証と認可には JWT の使用のみに制限されます。 あります。

  • 信頼できない環境では、JWT クレームは、 操作できる可能性があります。特定のタスクでも配送手段でもかまいません。

  • 信頼性の低い環境で実行するコードは、最初に JWT を発行するために信頼できる環境でコードを実行します。

  • Fleet Engine は、サービスの API 呼び出しに対して次のセキュリティ チェックを実行します。 resource:

    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 ロール

サービス アカウントとは、 ユーザーではなくアプリケーションによって使用される特殊なアカウントです。 通常、サービス アカウントは、異なる付与を許可する JWT を作成するために使用されます。 ロールに応じた権限セットが用意されています。不正使用の可能性を減らすため 複数のサービス アカウントを作成して、それぞれに最小限のロールを required ())。

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
配達車両とタスクの読み取り、および タスクのタスクを追跡できます。このサービス アカウントによって作成されたトークンは、 ロールは通常、デリバリー フリート オペレーターのウェブブラウザから使用します。

運送業者によって管理されるデバイスを配達員に提供している組織では、 Fleet Engine が提供する柔軟性を企業の IT 部門が Fleet Engine の一部またはすべてを統合するか選択する、信頼できるドライバー ユーザーのロールです。 モバイルアプリで行われた操作も確認できます。

Bring Your Own Device ポリシーをサポートしている組織では、 Fleet Engine の信頼されていないドライバ ユーザーロールの 車両位置情報の更新を Fleet Engine に送信するモバイルアプリ。その他 顧客のバックエンド サーバーから行われる必要があります。

Driver SDK と Consumer SDK は、これらの標準ロールを中心に構築されています。 ただし、カスタムロールを作成することは可能です。 任意の権限セットをバンドルできます。 Driver SDK と Consumer SDK でエラー メッセージが表示されるのは 必要な権限がありません。そのため、Google では強く カスタムロールの代わりに、上記の標準のロールセットを使用します。

サービス アカウントの作成

サービス アカウントは、IAM & Admin > Service Accounts を使用して作成できます。 タブ内にあります。[ロール] プルダウン リストから Fleet Engine に移動し、いずれかのロールをサービス アカウントに割り当てます。良い 各ロールに関連付けられたアカウントを示すために使用します。 たとえば、サービス アカウントにわかりやすい名前を付けます。

便宜上、信頼できないクライアント用の 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 Auth ライブラリ

Fleet Engine は JWT を使用して、信頼できない環境内の Fleet Engine API へのアクセスを制限する 必要があります。Fleet Engine Auth Library( GitHub では、 Fleet Engine JWT を構築し、安全に署名する必要があります。

このライブラリには次のような利点があります。

  • Fleet Engine トークンの作成プロセスを簡素化します。
  • 認証情報ファイル( 使用しないでください)。
で確認できます。

認可用の JSON Web Token(JWT)を作成する

Fleet Engine Auth Library を使用しない場合は、JWT を コードベースで直接作成できますそのためには、データ アナリストと JWT の概要と Fleet Engine との関係について説明します。だからこそ Fleet Engine Auth Library の利用を強くおすすめします。

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 UTC から。スキューには 10 分かかります。もし タイムスタンプが古すぎるか、将来の場合にサーバーがエラーを報告する可能性があります。
exp トークンが期限切れになったときのタイムスタンプ(経過時間(秒)) 1970 年 1 月 1 日 00:00:00 UTC から。タイムスタンプが無効な場合、リクエストは失敗します。 1 時間以上先になります
authorization ユースケースによっては、 「deliveryvehicleid」、「trackingid」、「taskid」、または「taskids」。

JWT トークンの作成とは、JWT トークンの署名を意味します。手順とコードサンプル については、以下をご覧ください。 OAuth を使用しないサービス アカウント認証。 その後、作成したトークンを gRPC 呼び出しまたは使用するその他のメソッドにアタッチできます。 Fleet Engine にアクセスします。

JWT クレーム

ラスト ワンマイル フリート ソリューションはプライベート クレームを使用する。非公開クレームを使用すると、 自分のデータにアクセスできます。たとえば、バックエンドで VM が 配達ドライバーのモバイル デバイス用の JSON Web Token を発行した場合、そのトークンは そのドライバーの配達額の値を含む deliveryvehicleid クレームが含まれている 車両 ID。次に、ドライバのロールに応じて、トークンによって 特定の配達車両 ID のみを使用できます。他の任意の車両 ID は使用できません。

ラスト ワンマイル フリート ソリューションでは、次のプライベート クレームを使用します。

  • deliveryvehicleid - 配達車両ごとの API を呼び出すときに使用します。
  • taskid - タスクごとの API を呼び出すときに使用します。
  • taskids - BatchCreateTasksAPI を呼び出すときに使用します。この主張は正しい タスク ID は、配列の形式ですべてのタスクの ID を リクエストを完了します。delivervehicleidtrackingid、または taskid 件の申し立て。
  • trackingid - GetTaskTrackingInfoAPI を呼び出すときに使用します。この文言は リクエスト内のトラッキング ID と照合します。delivervehicleidtaskid、または taskids 個のクレーム。

また、API を呼び出すときに、トークンには適切なクレームが含まれている必要があります。 使用できますが、特殊な値であるアスタリスク(*)を deliveryvehicleidtaskidtrackingid クレームの場合は「*」。アスタリスク ("*")は taskids クレームでも使用できますが、唯一の要素である必要があります。 繰り返しフィールドがあります

トークン署名なしファイルではなく、JSON を直接作成して署名する場合は、 アクセス トークンを使用する場合は、 OAuth を使用しないサービス アカウント認証 をご覧ください。

トークンを gRPC 呼び出しに関連付けるメカニズムは、 呼び出しに使用されるフレームワークです。トークンを指定するメカニズム 署名なしトークンを含む Authorization ヘッダーを HTTP 呼び出しに追加することです。 その値はトークンです。これは、API トークンの 配送追跡 またはフリート パフォーマンス 構築できます

次の例は、プロジェクトからのタスクごとのオペレーションのトークンを バックエンド サーバー:

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

次の例は、Cloud Storage から BigQuery への バックエンド サーバー:

    {
      "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 フィールドに、サービス アカウントの限定公開を指定します。 確認します。この値は、private_key_id JSON 形式のファイル。
  • iss フィールドと sub フィールドに、サービス アカウントのメールアドレスを指定します。 この値は、サービス アカウントの client_email フィールドで確認できます。 JSON ファイルです。
  • aud フィールドに https://SERVICE_NAME/ を指定します。
  • iat フィールドに、トークン作成時のタイムスタンプを指定します。 1970 年 1 月 1 日 00:00:00 UTC からの経過時間(秒)。10 分待つ 見ていきますタイムスタンプが古すぎる、または未来すぎる場合は、 サーバーがエラーを報告する可能性があります。
  • exp フィールドに、トークンが期限切れになるタイムスタンプを指定します。 1970 年 1 月 1 日 00:00:00 UTC からの経過秒数。推奨値 iat + 3600 です。

モバイル デバイスまたはエンドユーザーに渡すトークンに署名する際は、 を使用して、デリバリー ドライバまたはコンシューマのロールで認証情報ファイルを使用できるようにします。それ以外の場合は モバイル デバイスまたはエンドユーザーは、ファイルの内容を変更または アクセスを許可すべきではありません。