Konsument SDK zapewnia autoryzację za pomocą tokenów internetowych JSON. Token sieciowy JSON (JWT) to token autoryzacji, który zawiera co najmniej 1 roszczenie dotyczące usługi.
Pakiet konsumencki SDK używa tokena internetowego JSON udostępnionego przez aplikację do komunikacji z Fleet Engine. Szczegółowe informacje o tokenach wymaganych przez serwer Fleet Engine znajdziesz w artykule Tokeny sieciowe JSON i Wydawanie tokenów sieciowych JSON.
Token autoryzacyjny zapewnia dostęp do tych usług Fleet Engine:
TripService
– przyznaje pakietowi Consumer SDK dostęp do szczegółów przejazdu, w tym do pozycji pojazdu, trasy i szacowanego czasu przybycia. Tokeny autoryzacji usługi dotyczącej przejazdu muszą zawierać w nagłówkuauthorization
elementtripid:TRIP_ID
, gdzieTRIP_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?
W przypadku wywołań metod interfejsu API z środowisk o niskim poziomie zaufania usługa Fleet Engine wymaga korzystania z tokenów sieciowych JSON (JWT) podpisanych odpowiednim kontem usługi. Środowiska o niskim poziomie zaufania to smartfony i przeglądarki. Token JWT pochodzi z serwera, który jest pełnowymiarowym zaufanym środowiskiem. JWT jest podpisywany, szyfrowany i przekazywany do klienta na potrzeby kolejnych interakcji z serwerem, dopóki nie wygaśnie lub nie straci ważności.
Twój backend powinien uwierzytelniać i autoryzować się w Fleet Engine za pomocą standardowych mechanizmów domyślnych danych logowania aplikacji. Upewnij się, że używasz tokenów JWT podpisanych przez odpowiednie konto usługi. Listę ról kont usług znajdziesz w artykule Podstawy Fleet Engine, w sekcji Role kont usług Fleet Engine.
Z kolei backend powinien uwierzytelniać i autoryzować się w ramach Fleet Engine, korzystając ze standardowych mechanizmów danych logowania aplikacji.
Więcej informacji o tokenach sieciowych JSON znajdziesz w artykule Tokeny sieciowe JSON w podstawach działania Fleet Engine.
W jaki sposób 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 zainicjujesz 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
}
}
}