Che cos'è un token?
Fleet Engine richiede l'utilizzo di token web JSON (JWT) per le chiamate ai metodi API da ambienti a bassa attendibilità: smartphone e browser.
Un JWT ha origine sul tuo server, viene firmato, criptato e trasmesso al client per le successive interazioni con il server fino alla scadenza o alla perdita di validità.
Dettagli chiave
- Utilizza le credenziali predefinite dell'applicazione per l'autenticazione e l'autorizzazione in Fleet Engine.
- Utilizza un service account appropriato per firmare i JWT. Consulta i ruoli service account di Fleet Engine in Nozioni di base su Fleet Engine.
Per saperne di più sui token web JSON, consulta la sezione Token web JSON in Fleet Engine Essentials.
Come ottengono i token i clienti?
Una volta che un autista o un consumatore accede alla tua app utilizzando le credenziali di autorizzazione appropriate, tutti gli aggiornamenti emessi da quel dispositivo devono utilizzare i token di autorizzazione appropriati, che comunicano a Fleet Engine le autorizzazioni per l'app.
In qualità di sviluppatore, l'implementazione del client deve fornire la possibilità di eseguire le seguenti operazioni:
- Recupera un token web JSON dal tuo server.
- Riutilizza il token fino alla scadenza per ridurre al minimo gli aggiornamenti del token.
- Aggiorna il token quando scade.
La classe AuthTokenFactory
genera token di autorizzazione al momento dell'aggiornamento della posizione. L'SDK deve includere i token con le informazioni
di aggiornamento da inviare a Fleet Engine. Prima di inizializzare l'SDK, assicurati che l'implementazione
lato server possa emettere token.
Per i dettagli sui token previsti dal servizio Fleet Engine, vedi Emettere token web JSON per Fleet Engine.
Esempio di un recuperatore di token di autorizzazione
Di seguito è riportata un'implementazione di base di un 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);
}
}
}
Questa particolare implementazione utilizza il client HTTP Java integrato per recuperare un token in formato JSON dal server di autorizzazione. Il client salva il token per il riutilizzo e lo recupera di nuovo se il vecchio token è a 10 minuti dalla data di scadenza.
La tua implementazione potrebbe funzionare in modo diverso, ad esempio utilizzando un thread in background per aggiornare i token.
Per le librerie client disponibili per Fleet Engine, consulta Librerie client per i servizi di attività pianificate.