Uzyskaj tokeny autoryzacji

Pakiet Consumer SDK zapewnia autoryzację za pomocą tokenów JSON Web. Token sieciowy JSON (JWT) to token autoryzacyjny, który zawiera co najmniej 1 potwierdzenie dotyczące usługi.

Pakiet SDK dla klienta używa tokena JSON Web Token udostępnianego przez aplikację do komunikacji z silnikiem floty. Szczegółowe informacje o tokenach wymaganych przez serwer Fleet Engine znajdziesz w artykułach Tokeny internetowe JSONWydawanie tokenów internetowych JSON.

Token autoryzacji zapewnia dostęp do tych usług Fleet Engine:

  • TripService – daje pakietowi Consumer SDK dostęp do szczegółów przejazdu, w tym pozycji pojazdu, trasy i przewidywanego czasu przybycia. Tokeny autoryzacyjne usługi dotyczącej przejazdów muszą zawierać w nagłówku authorization element tripid:TRIP_ID, gdzie TRIP_ID to identyfikator przejazdu na żądanie, który jest udostępniany.

  • VehicleService – udostępnia pakietowi Consumer SDK informacje o przybliżonej lokalizacji pojazdu na potrzeby wyświetlania warstwy gęstości pojazdów i szacowania czasu dojazdu do punktu odbioru. Pakiet SDK dla konsumentów używa tylko przybliżonych lokalizacji, więc tokeny autoryzacji dla usługi dotyczącej pojazdu nie wymagają oświadczeniavehicleid.

Co to jest token?

Fleet Engine wymaga używania tokenów sieciowych JSON (JWT) do wywoływania metod interfejsu API z środowisk o niskim poziomie zaufania, takich jak smartfony i przeglądarki.

Token JWT pochodzi z serwera, jest podpisywany, szyfrowany i przekazywany do klienta do dalszych interakcji z serwerem, dopóki nie wygaśnie lub nie straci ważności.

Najważniejsze informacje

Więcej informacji o tokenach sieciowych JSON znajdziesz w artykule Tokeny sieciowe JSONpodstawach działania Fleet Engine.

Jak klienci otrzymują tokeny?

Gdy kierowca lub klient zaloguje się w aplikacji za pomocą odpowiednich danych logowania, wszelkie aktualizacje wysyłane z tego urządzenia muszą używać odpowiednich tokenów autoryzacji, które przekazują Fleet Engine uprawnienia aplikacji.

Jako deweloper powinieneś zadbać o to, aby implementacja klienta umożliwiała:

  • Pobierz token sieciowy JSON z serwera.
  • Używaj tokena, dopóki nie wygaśnie, aby zminimalizować odświeżanie tokena.
  • Odśwież token po jego wygaśnięciu.

Klasa AuthTokenFactory generuje tokeny autoryzacji podczas aktualizacji lokalizacji. Pakiet SDK musi zawierać tokeny z informacjami o aktualizacji, które mają zostać wysłane do Fleet Engine. Zanim spróbujesz zainicjować pakiet SDK, upewnij się, że implementacja po stronie serwera może wydawać tokeny.

Szczegółowe informacje o tokenach wymaganych przez usługę Fleet Engine znajdziesz w artykule Wydawanie tokenów sieciowych JSON na temat Fleet Engine.

Przykład pobierania tokena autoryzacji

Poniższy przykład kodu pokazuje, jak zaimplementować wywołanie zwrotne tokena autoryzacji.

Java

class JsonAuthTokenFactory implements AuthTokenFactory {

  private static final String TOKEN_URL =
      "https://yourauthserver.example/token";

  private static class CachedToken {
    String tokenValue;
    long expiryTimeMs;
    String tripId;
  }

  private CachedToken token;

  /*

*   This method is called on a background thread. Blocking is OK. However, be
*   aware that no information can be obtained from Fleet Engine until this
*   method returns.
*/
@Override
public String getToken(AuthTokenContext context) {
  // If there is no existing token or token has expired, go get a new one.
  String tripId = context.getTripId();
  if (tripId == null) {
    throw new RuntimeException("Trip ID is missing from AuthTokenContext");
  }
  if (token == null || System.currentTimeMillis() > token.expiryTimeMs ||
      !tripId.equals(token.tripId)) {
    token = fetchNewToken(tripId);
  }
  return token.tokenValue;
}

  private static CachedToken fetchNewToken(String tripId) {
    String url = TOKEN_URL + "/" + tripId;
    CachedToken token = new CachedToken();

    try (Reader r = new InputStreamReader(new URL(url).openStream())) {
      com.google.gson.JsonObject obj
          = com.google.gson.JsonParser.parseReader(r).getAsJsonObject();

      token.tokenValue = obj.get("ServiceToken").getAsString();
      token.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 5 minutes from that time.
    */
    token.expiryTimeMs -= 5 * 60 * 1000;
  } catch (IOException e) {
    /*
    *   It's OK to throw exceptions here. The error listeners will receive the
    *   error thrown here.
    */
    throw new RuntimeException("Could not get auth token", e);
  }
  token.tripId = tripId;

    return token;
  }
}

Kotlin

class JsonAuthTokenFactory : AuthTokenFactory() {

  private var token: CachedToken? = null

  /*

*   This method is called on a background thread. Blocking is OK. However, be
*   aware that no information can be obtained from Fleet Engine until this
*   method returns.
*/
override fun getToken(context: AuthTokenContext): String {
  // If there is no existing token or token has expired, go get a new one.
  val tripId =
    context.getTripId() ?:
      throw RuntimeException("Trip ID is missing from AuthTokenContext")

    if (token == null || System.currentTimeMillis() > token.expiryTimeMs ||
        tripId != token.tripId) {
      token = fetchNewToken(tripId)
    }

    return token.tokenValue
  }

  class CachedToken(
    var tokenValue: String? = "",
    var expiryTimeMs: Long = 0,
    var tripId: String? = "",
  )

  private companion object {
    const val TOKEN_URL = "https://yourauthserver.example/token"

    fun fetchNewToken(tripId: String) {
      val url = "$TOKEN_URL/$tripId"
      val token = CachedToken()

      try {
        val reader = InputStreamReader(URL(url).openStream())

        reader.use {
          val obj = com.google.gson.JsonParser.parseReader(r).getAsJsonObject()

          token.tokenValue = obj.get("ServiceToken").getAsString()
          token.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 5 minutes from that time.
        */
        token.expiryTimeMs -= 5 * 60 * 1000
      }
    } catch (e: IOException) {
      /*
            *   It's OK to throw exceptions here. The error listeners will receive the
            *   error thrown here.
      */
      throw RuntimeException("Could not get auth token", e)
    }

      token.tripId = tripId

      return token
    }
  }
}

Co dalej?

Inicjowanie pakietu Consumer SDK