Uzyskaj tokeny autoryzacji

Pakiet Consumer SDK zapewnia autoryzację za pomocą tokenów sieciowych JSON. Token sieciowy JSON (JWT) to token autoryzacji, który zawiera co najmniej 1 deklarację dotyczącą usługi.

Pakiet Consumer SDK używa tokena sieciowego JSON dostarczonego przez aplikację do komunikacji z Fleet Engine. Szczegółowe informacje o tokenach oczekiwanych przez serwer Fleet Engine znajdziesz w sekcjach Tokeny sieciowe JSON i Generowanie tokenów sieciowych JSON.

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

  • TripService – daje pakietowi Consumer SDK dostęp do szczegółów podróży, w tym do pozycji pojazdu, trasy i szacowanego czasu dotarcia na miejsce. Tokeny autoryzacji dla usługi podróży muszą zawierać deklarację tripid:TRIP_ID w nagłówku authorization tokena, gdzie TRIP_ID to identyfikator podróży na żądanie, która jest udostępniana.

  • VehicleService – udostępnia pakietowi Consumer SDK informacje o przybliżonej lokalizacji pojazdu, aby wyświetlać warstwę gęstości pojazdów i szacować czas przyjazdu do miejsca odbioru. Ponieważ pakiet Consumer SDK używa tylko przybliżonych lokalizacji, tokeny autoryzacji dla usługi pojazdów nie wymagają deklaracji vehicleid.

Co to jest token?

Fleet Engine wymaga używania tokenów sieciowych JSON (JWT) w przypadku wywołań metod API z środowisk o niskim poziomie zaufania , czyli ze smartfonów i przeglądarek.

Token JWT pochodzi z Twojego serwera, jest podpisany i zaszyfrowany, a następnie przekazywany do klienta w celu dalszych interakcji z serwerem, dopóki nie wygaśnie lub nie będzie już ważny.

Najważniejsze informacje

Więcej informacji o tokenach sieciowych JSON znajdziesz w sekcji Tokeny sieciowe JSON w Podstawy Fleet Engine.

Jak klienci uzyskują tokeny?

Gdy kierowca lub konsument zaloguje się w Twojej aplikacji za pomocą odpowiednich danych uwierzytelniających, wszystkie aktualizacje wysyłane z tego urządzenia muszą używać odpowiednich tokenów autoryzacji, które informują Fleet Engine o uprawnieniach aplikacji.

Jako deweloper musisz zapewnić, że implementacja klienta będzie umożliwiać wykonanie tych czynności:

  • Pobieranie tokena sieciowego JSON z serwera.
  • Ponowne używanie tokena do momentu jego wygaśnięcia, aby zminimalizować liczbę odświeżeń tokena.
  • Odświeżanie tokena, gdy wygaśnie.

Klasa AuthTokenFactory generuje tokeny autoryzacji w momencie informacja o zmianie lokalizacji. Pakiet SDK musi spakować tokeny z informacjami o aktualizacji, aby wysłać je do Fleet Engine. Zanim zainicjujesz pakiet SDK, upewnij się, że implementacja po stronie serwera może generować tokeny.

Szczegółowe informacje o tokenach oczekiwanych przez usługę Fleet Engine znajdziesz w sekcji Generowanie tokenów sieciowych JSON dla 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