認証トークンを取得する

トークンとは

信頼性の低い環境からの API メソッド呼び出しの場合、Fleet Engine では、適切なサービス アカウントによって署名された JSON Web Token(JWT)を使用する必要があります。信頼性の低い環境には、スマートフォンやブラウザが含まれます。JWT の送信元は、完全に信頼できる環境であるサーバーです。JWT は署名され、暗号化されて、有効期限が切れるか無効になるまで、その後のサーバー インタラクションのためにクライアントに渡されます。

バックエンドでは、標準のアプリケーションのデフォルト認証情報のメカニズムを使用して、Fleet Engine に対する認証と認可を行う必要があります。適切なサービス アカウントで署名された JWT を使用してください。サービス アカウントのロールの一覧については、Fleet Engine の基本Fleet Engine サービス アカウントのロールをご覧ください。

これに対して、バックエンドでは、標準のアプリケーションのデフォルト認証情報のメカニズムを使用して Fleet Engine に対する認証と認可を行う必要があります。

JSON Web Token の詳細については、Fleet Engine の基本JSON Web Token をご覧ください。

クライアントはどのようにトークンを取得しますか?

ドライバまたはコンシューマが適切な認可認証情報を使用してアプリにログインしたら、そのデバイスから発行されるアップデートでは適切な認可トークンを使用する必要があります。これにより、Fleet Engine にアプリの権限が通知されます。

デベロッパーは、クライアントの実装で次の機能を提供する必要があります。

  • サーバーから JSON Web Token を取得します。
  • トークンの更新を最小限に抑えるために、期限切れになるまでトークンを再利用します。
  • 期限切れになったらトークンを更新します。

AuthTokenFactory クラスは、位置情報の更新時に認証トークンを生成します。SDK は、Fleet Engine に送信する更新情報とともにトークンをパッケージ化する必要があります。SDK を初期化する前に、サーバーサイドの実装でトークンを発行できることを確認してください。

Fleet Engine サービスが必要とするトークンの詳細については、Fleet Engine の JSON ウェブトークンを発行するをご覧ください。

認証トークン フェッチャーの例

AuthTokenFactory のスケルトン実装は次のとおりです。

class JsonAuthTokenFactory implements AuthTokenFactory {
  private String vehicleServiceToken;  // initially null
  private long expiryTimeMs = 0;
  private String vehicleId;

  // This method is called on a thread whose only responsibility is to send
  // location updates. Blocking is OK, but just know that no location updates
  // can occur until this method returns.
  @Override
  public String getToken(AuthTokenContext authTokenContext) {
    String vehicleId = requireNonNull(context.getVehicleId());

    if (System.currentTimeMillis() > expiryTimeMs || !vehicleId.equals(this.vehicleId)) {
      // The token has expired, go get a new one.
      fetchNewToken(vehicleId);
    }

    return vehicleServiceToken;
  }

  private void fetchNewToken(String vehicleId) {
    String url = "https://yourauthserver.example/token/" + vehicleId;

    try (Reader r = new InputStreamReader(new URL(url).openStream())) {
      com.google.gson.JsonObject obj
          = com.google.gson.JsonParser.parseReader(r).getAsJsonObject();
      vehicleServiceToken = obj.get("VehicleServiceToken").getAsString();
      expiryTimeMs = obj.get("TokenExpiryMs").getAsLong();

      // The expiry time could be an hour from now, but just to try and avoid
      // passing expired tokens, we subtract 10 minutes from that time.
      expiryTimeMs -= 10 * 60 * 1000;
      this.vehicleId = vehicleId;
    } catch (IOException e) {
      // It's OK to throw exceptions here. The StatusListener you passed to
      // create the DriverContext class will be notified and passed along the failed
      // update warning.
      throw new RuntimeException("Could not get auth token", e);
    }
  }
}

この実装では、組み込みの Java HTTP クライアントを使用して、承認サーバーから JSON 形式のトークンを取得します。クライアントはトークンを保存して再利用し、古いトークンが有効期限の 10 分以内にある場合はトークンを再取得します。

実装では、バックグラウンド スレッドを使用してトークンを更新するなど、異なる処理を行う場合があります。

Fleet Engine で利用可能なクライアント ライブラリについては、オンデマンド ルートサービス用のクライアント ライブラリをご覧ください。

次のステップ

Driver SDK を初期化する