Was ist ein Token?
Für API-Methodenaufrufe aus Umgebungen mit geringem Vertrauensgrad (Smartphones und Browser) ist in Fleet Engine die Verwendung von JSON Web Tokens (JWTs) erforderlich.
Ein JWT wird auf Ihrem Server erstellt, signiert, verschlüsselt und an den Client weitergegeben. Es wird für nachfolgende Serverinteraktionen verwendet, bis es abläuft oder nicht mehr gültig ist.
Wichtige Details
- Verwenden Sie Standardanmeldedaten für Anwendungen, um sich bei Fleet Engine zu authentifizieren und zu autorisieren.
- Verwenden Sie ein geeignetes Dienstkonto, um JWTs zu signieren. Weitere Informationen finden Sie unter Dienstkontorollen für Fleet Engine in Grundlagen von Fleet Engine.
Weitere Informationen zu JSON Web Tokens finden Sie unter JSON Web Tokens in Grundlagen von Fleet Engine.
Wie erhalten Clients Tokens?
Sobald sich ein Fahrer oder Nutzer mit den entsprechenden Autorisierungsanmeldedaten in Ihrer App anmeldet, müssen alle von diesem Gerät ausgegebenen Aktualisierungen entsprechende Autorisierungstokens verwenden, die Fleet Engine die Berechtigungen für die App mitteilen.
Als Entwickler sollte Ihre Clientimplementierung Folgendes ermöglichen:
- Ein JSON Web Token von Ihrem Server abrufen.
- Das Token bis zum Ablauf wiederverwenden, um Tokenaktualisierungen zu minimieren.
- Das Token aktualisieren, wenn es abläuft.
Die Klasse AuthTokenFactory generiert Autorisierungstokens zum Zeitpunkt der Standortaktualisierung. Das SDK muss die Tokens mit den Aktualisierungsinformationen verpacken, um sie an Fleet Engine zu senden. Achten Sie darauf, dass Ihre serverseitige Implementierung Tokens ausgeben kann, bevor Sie das SDK initialisieren.
Details zu den vom Fleet Engine-Dienst erwarteten Tokens finden Sie unter JSON Web Tokens für Fleet Engine ausgeben.
Beispiel für einen Autorisierungstoken-Fetcher
Hier ist eine Skelettimplementierung von 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 abläuft.
Ihre Implementierung kann sich davon unterscheiden, z. B. durch die Verwendung eines Hintergrundthreads zum Aktualisieren von Tokens.
Die verfügbaren Clientbibliotheken für Fleet Engine finden Sie unter Clientbibliotheken für Dienste für geplante Aufgaben.