Was ist ein Token?
Für API-Methodenaufrufe aus Umgebungen mit geringem Vertrauensniveau (Smartphones und Browser) ist in Fleet Engine die Verwendung von JSON-Webtokens (JWTs) erforderlich.
Ein JWT wird auf Ihrem Server erstellt, signiert, verschlüsselt und an den Client übergeben. 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 zum Signieren von JWTs. Weitere Informationen finden Sie unter Rollen für Fleet Engine-Dienstkonten in Fleet Engine-Grundlagen.
Weitere Informationen zu JSON Web Tokens finden Sie unter JSON Web Tokens in Fleet Engine Essentials.
Wie erhalten Clients Tokens?
Sobald sich ein Fahrer oder Nutzer mit den entsprechenden Autorisierungsanmeldedaten in Ihrer App anmeldet, müssen für alle von diesem Gerät ausgegebenen Aktualisierungen die entsprechenden Autorisierungstokens verwendet werden, die Fleet Engine die Berechtigungen für die App mitteilen.
Als Entwickler sollte Ihre Clientimplementierung die folgenden Möglichkeiten bieten:
- Rufen Sie ein JSON-Webtoken von Ihrem Server ab.
- Verwenden Sie das Token wieder, bis es abläuft, um die Anzahl der Tokenaktualisierungen zu minimieren.
- Aktualisieren Sie das Token, wenn es abläuft.
Die Klasse AuthTokenFactory
generiert Autorisierungstokens zum Zeitpunkt der Standortaktualisierung. Das SDK muss die Tokens mit den Updateinformationen verpacken, die an Fleet Engine gesendet werden sollen. Achten Sie darauf, dass Ihre serverseitige Implementierung Tokens ausstellen kann, bevor Sie das SDK initialisieren.
Details zu den vom Fleet Engine-Dienst erwarteten Tokens finden Sie unter JSON-Webtokens für Fleet Engine ausstellen.
Beispiel für einen Abrufer für 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 neu ab, wenn das alte Token innerhalb von 10 Minuten abläuft.
In Ihrer Implementierung kann das anders aussehen, z. B. können Tokens in einem Hintergrundthread aktualisiert werden.
Informationen zu den verfügbaren Clientbibliotheken für Fleet Engine finden Sie unter Clientbibliotheken für Dienste für geplante Aufgaben.