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
Hier ist eine Skelettimplementierung eines 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);
}
}
}
Bei dieser Implementierung wird der integrierte Java-HTTP-Client verwendet, um ein Token im JSON-Format vom Autorisierungsserver abzurufen. Der Client speichert das Token zur Wiederverwendung und ruft es noch einmal ab, wenn das alte Token innerhalb von 10 Minuten nach Ablauf abläuft.
In Ihrer Implementierung kann es anders ablaufen, z. B. wenn Sie zum Aktualisieren von Tokens einen Hintergrund-Thread verwenden.
Informationen zu den verfügbaren Clientbibliotheken für Fleet Engine finden Sie unter Clientbibliotheken für Dienste mit geplanten Aufgaben.