Das Consumer SDK bietet eine Autorisierung mit JSON Web Tokens. Ein JSON Web Token (JWT) ist ein Autorisierungstoken, das eine oder mehrere Ansprüche auf einen Dienst enthält.
Das Consumer SDK verwendet das von der Anwendung bereitgestellte JSON-Webtoken, um mit der Fleet Engine zu kommunizieren. Weitere Informationen zu den vom Fleet Engine-Server erwarteten Tokens finden Sie unter JSON Web Tokens und JSON Web Tokens ausstellen.
Das Autorisierungstoken gewährt Zugriff auf die folgenden Fleet Engine-Dienste:
TripService
: Hiermit erhält das Consumer SDK Zugriff auf Fahrtdetails, einschließlich Fahrzeugposition, Route und geschätzter Ankunftszeit. Autorisierungstokens für den Fahrtdienst müssen einentripid:TRIP_ID
-Anspruch imauthorization
-Header des Tokens enthalten. Dabei istTRIP_ID
die Fahrt-ID der freigegebenen Fahrt auf Abruf.VehicleService
: Gibt dem Consumer SDK Informationen zur ungefähren Fahrzeugposition für die Anzeige der Fahrzeugdichteebene und die Schätzung der ETAs für den Abholpunkt. Da das Consumer SDK nur ungefähre Standorte verwendet, ist für Autorisierungstokens für den Fahrzeugdienst keinvehicleid
-Anspruch erforderlich.
Was ist ein Token?
Für API-Methodenaufrufe aus Umgebungen mit geringem Vertrauen (Smartphones und Browser) sind in der Fleet Engine JSON Web Tokens (JWTs) erforderlich.
Ein JWT wird auf deinem Server generiert, signiert, verschlüsselt und für nachfolgende Serverinteraktionen an den Client übergeben, bis es abläuft oder nicht mehr gültig ist.
Wichtige Details
- Verwenden Sie Standardanmeldedaten für Anwendungen, um sich bei der Fleet Engine zu authentifizieren und zu autorisieren.
- Verwenden Sie ein geeignetes Dienstkonto, um JWTs zu signieren. Informationen zu den Rollen des Fleet Engine-Dienstkontos finden Sie unter Fleet Engine – Grundlagen.
Weitere Informationen zu JSON Web Tokens finden Sie unter JSON Web Tokens im Artikel Fleet Engine Essentials.
Wie erhalten Kunden Tokens?
Sobald sich ein Fahrer oder Verbraucher mit den entsprechenden Autorisierungsdaten in Ihrer App anmeldet, müssen alle von diesem Gerät ausgegebenen Updates die entsprechenden Autorisierungstokens verwenden, die der Fleet Engine die Berechtigungen für die App mitteilen.
Als Entwickler sollte Ihre Clientimplementierung Folgendes ermöglichen:
- Rufe ein JSON Web Token von deinem Server ab.
- Wiederverwenden Sie das Token, bis es abläuft, um die Anzahl der Tokenaktualisierungen zu minimieren.
- Aktualisieren Sie das Token, wenn es abläuft.
Die AuthTokenFactory
-Klasse generiert Autorisierungstokens beim Aktualisieren des Standorts. Das SDK muss die Tokens mit den Aktualisierungsinformationen verpacken, die an die Fleet Engine gesendet werden sollen. Prüfen Sie, ob Ihre serverseitige Implementierung Tokens ausstellen kann, bevor Sie das SDK initialisieren.
Weitere Informationen zu den vom Fleet Engine-Dienst erwarteten Tokens findest du unter JSON-Webtokens ausstellen für Fleet Engine.
Beispiel für einen Abrufer von Autorisierungstokens
Das folgende Codebeispiel zeigt, wie ein Autorisierungstoken-Callback implementiert wird.
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
}
}
}