Che cos'è un token?
Fleet Engine richiede l'utilizzo di token web JSON (JWT) per le chiamate ai metodi API da ambienti con un livello di attendibilità basso: 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 service account appropriato per firmare i JWT. Consulta i ruoli del service account Fleet Engine in Nozioni di base su Fleet Engine.
Per saperne di più sui token web JSON, consulta Token web JSON in Nozioni di base su Fleet Engine.
In che modo i client ricevono 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.
In qualità di sviluppatore, l'implementazione del client deve fornire la possibilità di:
- 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 pacchettizzare i token con le informazioni di aggiornamento da inviare a Fleet Engine. Assicurati che l'implementazione lato server possa emettere token prima di inizializzare l'SDK.
Per informazioni dettagliate sui token previsti dal servizio Fleet Engine, consulta Genera token web JSON per Fleet Engine.
Esempio di un recuperatore di token di autorizzazione
Ecco 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 riutilizzarlo e lo recupera di nuovo se il token precedente scade entro 10 minuti dalla sua data di scadenza.
La tua implementazione potrebbe eseguire le operazioni in modo diverso, ad esempio utilizzando un thread in background per aggiornare i token di aggiornamento.
Per le librerie client disponibili per Fleet Engine, consulta Librerie client per i servizi di attività pianificate.