認証トークンを取得する

トークンとは

Fleet Engine では、スマートフォンやブラウザなどの信頼度の低い環境からの API メソッド呼び出しに JSON Web Token(JWT)を使用する必要があります。

JWT はサーバーで生成され、署名と暗号化が行われてクライアントに渡されます。有効期限が切れるか無効になるまで、以降のサーバーとのやり取りで使用されます。

主な詳細

JSON ウェブトークンの詳細については、Fleet Engine の基本JSON ウェブトークンをご覧ください。

クライアントがトークンを取得する方法

ドライバーまたは消費者が適切な認証情報を使用してアプリにログインすると、そのデバイスから発行される更新では、適切な認証トークンを使用する必要があります。これにより、アプリの権限が Fleet Engine に伝達されます。

デベロッパーとして、クライアント実装で次の操作を行えるようにする必要があります。

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

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

Fleet Engine サービスで想定されるトークンの詳細については、Fleet Engine の JSON Web Token を発行するをご覧ください。

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

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