認証トークンを取得する

トークンとは

信頼性の低い環境からの 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 をご覧ください。

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

ドライバまたはコンシューマが適切な API を使用してアプリにログインしたら、 そのデバイスから発行されるアップデートには、 適切な認可トークンが Fleet Engine と通信し、 付与します。

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

  • サーバーから JSON ウェブトークンを取得します。
  • 有効期限が切れるまでトークンを再利用して、トークンの更新を最小限にします。
  • 期限切れになったらトークンを更新します。

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

Fleet Engine サービスによって要求されるトークンの詳細については、Issue JSON をご覧ください。 Fleet Engine 用のウェブトークン

認可トークン取得ツールの例

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 を初期化する