Recupera token di autorizzazione

L'SDK Consumer fornisce l'autorizzazione utilizzando i token web JSON. Un token JWT (JSON Web Token) è un token di autorizzazione che fornisce una o più attestazioni su un servizio.

L'SDK consumer utilizza il token web JSON fornito dall'applicazione per comunicare con Fleet Engine. Per informazioni dettagliate sui token previsti dal server di Fleet Engine, consulta Token web JSON e Emettere token web JSON.

Il token di autorizzazione fornisce l'accesso ai seguenti servizi Fleet Engine:

  • TripService: fornisce all'SDK consumer l'accesso ai dettagli della corsa, tra cui posizione del veicolo, percorso e orario di arrivo stimato. I token di autorizzazione per il servizio di corsa devono includere un claim tripid:TRIP_ID nell'intestazione authorization del token, dove TRIP_ID è l'ID corsa della corsa on demand condivisa.

  • VehicleService: fornisce all'SDK consumer informazioni sulla posizione approssimativa del veicolo per visualizzare il livello di densità dei veicoli e stimare gli orari di arrivo stimati al punto di ritiro. Poiché l'SDK consumer utilizza solo località approssimative, i token di autorizzazione per il servizio del veicolo non richiedono una dichiarazione vehicleid.

Che cos'è un token?

Per le chiamate di metodi API da ambienti a bassa attendibilità, Fleet Engine richiede l'utilizzo di token web JSON (JWT) firmati da un account di servizio appropriato. Gli ambienti con un livello di attendibilità basso includono smartphone e browser. Un JWT viene generato sul tuo server, che è un ambiente completamente attendibile. Il JWT viene firmato, criptato e passato al client per le interazioni successive con il server finché non scade o non è più valido.

Il backend deve autenticarsi e autorizzarsi in Fleet Engine utilizzando meccanismi di credenziali predefinite dell'applicazione standard. Assicurati di utilizzare JWT firmati da un account di servizio appropriato. Per un elenco di ruoli per l'account di servizio, vedi i ruoli dell'account di servizio di Fleet Engine nell'articolo Nozioni di base di Fleet Engine.

Al contrario, il backend deve autenticarsi e autorizzarsi in Fleet Engine utilizzando i meccanismi standard delle credenziali predefinite dell'applicazione.

Per ulteriori informazioni sui token web JSON, consulta Token web JSON in Elementi essenziali di Fleet Engine.

In che modo i clienti ricevono i token?

Quando un conducente o un consumatore accede all'app utilizzando le credenziali di autorizzazione appropriate, tutti gli aggiornamenti emessi da tale dispositivo devono utilizzare 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 i relativi aggiornamenti.
  • Aggiorna il token alla scadenza.

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 i dettagli dei token previsti dal servizio Fleet Engine, vedi emissione di token web JSON per Fleet Engine.

Esempio di un recuperatore di token di autorizzazione

Il seguente esempio di codice mostra come implementare un callback per il token di autorizzazione.

Java

class JsonAuthTokenFactory implements AuthTokenFactory {

  private static final String TOKEN_URL =
      "https://yourauthserver.example/token";

  private static class CachedToken {
    String tokenValue;
    long expiryTimeMs;
    String tripId;
  }

  private CachedToken token;

  /*

*   This method is called on a background thread. Blocking is OK. However, be
*   aware that no information can be obtained from Fleet Engine until this
*   method returns.
*/
@Override
public String getToken(AuthTokenContext context) {
  // If there is no existing token or token has expired, go get a new one.
  String tripId = context.getTripId();
  if (tripId == null) {
    throw new RuntimeException("Trip ID is missing from AuthTokenContext");
  }
  if (token == null || System.currentTimeMillis() > token.expiryTimeMs ||
      !tripId.equals(token.tripId)) {
    token = fetchNewToken(tripId);
  }
  return token.tokenValue;
}

  private static CachedToken fetchNewToken(String tripId) {
    String url = TOKEN_URL + "/" + tripId;
    CachedToken token = new CachedToken();

    try (Reader r = new InputStreamReader(new URL(url).openStream())) {
      com.google.gson.JsonObject obj
          = com.google.gson.JsonParser.parseReader(r).getAsJsonObject();

      token.tokenValue = obj.get("ServiceToken").getAsString();
      token.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 5 minutes from that time.
    */
    token.expiryTimeMs -= 5 * 60 * 1000;
  } catch (IOException e) {
    /*
    *   It's OK to throw exceptions here. The error listeners will receive the
    *   error thrown here.
    */
    throw new RuntimeException("Could not get auth token", e);
  }
  token.tripId = tripId;

    return token;
  }
}

Kotlin

class JsonAuthTokenFactory : AuthTokenFactory() {

  private var token: CachedToken? = null

  /*

*   This method is called on a background thread. Blocking is OK. However, be
*   aware that no information can be obtained from Fleet Engine until this
*   method returns.
*/
override fun getToken(context: AuthTokenContext): String {
  // If there is no existing token or token has expired, go get a new one.
  val tripId =
    context.getTripId() ?:
      throw RuntimeException("Trip ID is missing from AuthTokenContext")

    if (token == null || System.currentTimeMillis() > token.expiryTimeMs ||
        tripId != token.tripId) {
      token = fetchNewToken(tripId)
    }

    return token.tokenValue
  }

  class CachedToken(
    var tokenValue: String? = "",
    var expiryTimeMs: Long = 0,
    var tripId: String? = "",
  )

  private companion object {
    const val TOKEN_URL = "https://yourauthserver.example/token"

    fun fetchNewToken(tripId: String) {
      val url = "$TOKEN_URL/$tripId"
      val token = CachedToken()

      try {
        val reader = InputStreamReader(URL(url).openStream())

        reader.use {
          val obj = com.google.gson.JsonParser.parseReader(r).getAsJsonObject()

          token.tokenValue = obj.get("ServiceToken").getAsString()
          token.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 5 minutes from that time.
        */
        token.expiryTimeMs -= 5 * 60 * 1000
      }
    } catch (e: IOException) {
      /*
            *   It's OK to throw exceptions here. The error listeners will receive the
            *   error thrown here.
      */
      throw RuntimeException("Could not get auth token", e)
    }

      token.tripId = tripId

      return token
    }
  }
}

Passaggi successivi

Inizializzare l'SDK consumer