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 passato 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 account di servizio appropriato per firmare i JWT. Consulta la sezione Ruoli degli account di servizio 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 Nozioni di base su Fleet Engine.
In che modo i client ottengono i token?
Una volta che un conducente 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.
Come sviluppatore, l'implementazione del client deve fornire la possibilità di:
- Recuperare un token web JSON dal server.
- Riutilizzare il token fino alla scadenza per ridurre al minimo gli aggiornamenti dei token.
- Aggiornare il token alla scadenza.
La classe AuthTokenFactory genera token di autorizzazione al momento dell'aggiornamento della posizione. L'SDK deve includere i token nelle informazioni di aggiornamento da inviare a Fleet Engine. Assicurati che l'implementazione lato server possa emettere token prima di inizializzare l'SDK.
Per i dettagli sui token previsti dal servizio Fleet Engine, consulta Emettere token web JSON per Fleet Engine.
Esempio di recupero di un token di autorizzazione
Di seguito è riportata un'implementazione scheletrica 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 implementazione specifica 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 è entro 10 minuti dalla data di scadenza.
La tua implementazione potrebbe essere diversa, 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 viaggi on demand.