JSON ウェブトークンを発行する

このドキュメントでは、ウェブベースおよびモバイルベースのアプリが Fleet Engine データにアクセスできるようにする際に、JSON Web Token を発行する方法について説明します。まだお読みでない場合は、Fleet Engine のセキュリティ セクションの JSON ウェブトークンをご覧ください。Fleet Engine サービスでは、次のいずれかの方法で JWT を発行できます。

  • 認証ライブラリを使用する - コードベースが Java で記述されている場合は、この方法を使用することをおすすめします。このライブラリは、サービスで必要となる可能性のあるすべてのユースケース シナリオの JWT の発行を処理し、実装を大幅に簡素化します。
  • 独自の JWT を作成する - Google の JWT ライブラリを使用できない場合は、独自のコードベースに組み込む必要があります。このセクションでは、各シナリオの JWT のさまざまな例を示します。

JWT の仕組み

携帯電話やウェブブラウザなどの信頼できない環境の場合、バックエンド サーバーは次のように機能する JWT を発行します。

  • 信頼度の低い環境で実行されているクライアント コードが、信頼度の高い環境で実行されているサーバーコードを呼び出し、Fleet Engine に渡す適切な JWT をリクエストします。

  • JWT はサービス アカウントに関連付けられているため、Fleet Engine に送信されたリクエストは、JWT に署名したサービス アカウントに暗黙的に関連付けられます。

  • JWT クレームは、クライアントが操作できるリソース(特定の車両、ルート、タスクなど)をさらに制限します。

Java 用の認可ライブラリを使用する

Java 用 Fleet Engine 認証ライブラリを使用するには、GitHub リポジトリをご覧ください。このライブラリを使用すると、Fleet Engine JWT の構築が簡素化され、安全に署名できます。次の機能を提供します。

  • プロジェクトの依存関係の宣言
  • オンデマンド トリップまたはスケジュール設定されたタスクのすべてのサービス アカウント ロールの完全なリスト
  • 認証情報ファイルの使用以外のトークン署名メカニズム(サービス アカウントの権限借用など)
  • gRPC スタブまたは Google API Codegen(GAPIC)クライアント ライブラリから送信されるリクエストに署名付きトークンを付加します。
  • 署名者を Fleet Engine クライアント ライブラリと統合する手順

コードから JWT を発行する場合

Java 用認可ライブラリを使用できない場合は、独自のコードベースで JWT を実装する必要があります。このセクションでは、独自のトークンを作成するためのガイドラインをいくつか示します。JWT のフィールドとクレームのリストについては、Fleet Engine のセキュリティ セクションの JSON ウェブトークンをご覧ください。Fleet Engine で使用されるサービス アカウントのロールについては、サービス アカウントのロールをご覧ください。オンデマンドの乗車またはスケジュール設定されたタスクの JWT の例については、次のセクションをご覧ください。

一般的なガイドライン

  • 適切なサービス アカウントとロールを使用する。サービス アカウントと関連するロールにより、トークンをリクエストするユーザーが、トークンによってアクセス権が付与される情報を表示する権限を持っていることが保証されます。詳細は以下のとおりです。
    • モバイル デバイスに渡す JWT に署名する場合は、Driver SDK または Consumer SDK のロールのサービス アカウントを使用します。そうしないと、モバイル デバイスがアクセスすべきでないデータにアクセスして変更する可能性があります。
    • 特権呼び出しに使用する JWT に署名する場合は、ADC または JWT を使用するときに、正しい Fleet Engine 管理者ロールを持つサービス アカウントを使用します。それ以外の場合、オペレーションは失敗します。
  • 作成したトークンのみを共有します。トークンの作成に使用した認証情報を共有しないでください。
  • gRPC 呼び出しの場合、トークンを付加するメカニズムは、呼び出しに使用される言語とフレームワークによって異なります。HTTP 呼び出しにトークンを指定するメカニズムは、値がトークンであるベアラートークンを含む Authorization ヘッダーを含めることです。
  • 有効期限を返します。サーバーは、通常は秒単位でトークンの有効期限を返す必要があります。
  • OAuth 2.0 アクセス トークンを使用するのではなく、JSON をトークン ベアラとして直接作成して署名する必要がある場合は、Identity デベロッパー ドキュメントのOAuth を使用しないサービス アカウントの認可の手順をご覧ください。

オンデマンドの乗車の場合

  • JWT ペイロードを作成するときに、呼び出しが行われる車両 ID または乗車 ID の値に設定されたキー vehicleid または tripid を使用して、認可セクションに追加のクレームを追加します。

スケジュール設定されたタスクの場合

  • サーバーが他の API を呼び出す場合、トークンには適切なクレームも含まれている必要があります。これを行うには、次の操作を行います。
    • 各キーの値を * に設定します。
    • ユーザーにすべての taskidsdeliveryvehicleids へのアクセス権を付与します。これを行うには、taskid キーと deliveryvehicleid キーを使用して、認証セクションに追加のクレームを追加します。
    • taskids クレームでアスタリスク(*)を使用する場合は、配列内の唯一の要素にする必要があります。

オンデマンド乗車用の JWT の例

このセクションでは、オンデマンド乗車を使用する場合の一般的なシナリオの JWT の例を示します。

ドライバー アプリ オペレーションのトークンの例

{
  "alg": "RS256",
  "typ": "JWT",
  "kid": "private_key_id_of_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": {
     "vehicleid": "driver_12345"
   }
}

コンシューマー アプリ オペレーションのトークンの例

{
  "alg": "RS256",
  "typ": "JWT",
  "kid": "private_key_id_of_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": {
     "tripid": "trip_54321"
   }
}

スケジュール設定されたタスクの JWT の例

このセクションでは、スケジュール設定されたタスクを使用する場合の一般的なシナリオの JWT の例を示します。

ドライバー アプリのトークンの例

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

コンシューマー アプリのトークンの例

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

フリート オペレーションの JWT の例

このセクションでは、フリート オペレーションの一般的なシナリオの JWT の例を示します。

フリート内のすべてのタスクと車両を追跡するトークンの例

次の例は、オペレーターが使用するウェブベースのアプリからフリート内のすべてのタスクと車両を追跡するトークンです。これらのオペレーションに必要な権限は、クライアント アプリケーションよりも大きくなります。このトークンを使用するクライアントサイドの実装については、JavaScript Fleet Tracking ライブラリを設定するをご覧ください。

  • Fleet Engine Delivery Fleet Reader Cloud IAM ロールを使用してトークンに署名します。

   {
      "alg": "RS256",
      "typ": "JWT",
      "kid": "private_key_id_of_consumer_service_account"
    }
    .
    {
      "iss": "superuser@yourgcpproject.iam.gserviceaccount.com",
      "sub": "superuser@yourgcpproject.iam.gserviceaccount.com",
      "aud": "https://fleetengine.googleapis.com/",
      "iat": 1511900000,
      "exp": 1511903600,
      "scope": "https://www.googleapis.com/auth/xapi",
      "authorization": {
         "taskid": "*",
         "deliveryvehicleid": "*",
       }
    }

バックエンド サーバー オペレーションの代替認証方法

バックエンド サーバー オペレーションの認証には ADC を使用することをおすすめします。ADC を使用できず、JWT を使用する必要がある場合は、次の例をご覧ください。

オンデマンド バックエンド サーバー オペレーションのトークンの例

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

スケジュールされたバックエンド サーバー オペレーションのトークンの例

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

次のステップ

  • セットアップを確認して、トライアル車両を作成し、トークンが想定どおりに動作することを確認します。
  • バックエンド サーバー オペレーションで JWT の代わりに ADC を使用する方法については、セキュリティの概要をご覧ください。