Obtenir des jetons d'autorisation

Le SDK grand public fournit une autorisation à l'aide de jetons Web JSON. Un jeton Web JSON (JWT) est un jeton d'autorisation qui fournit une ou plusieurs revendications sur un service.

Le SDK grand public utilise le jeton Web JSON fourni par l'application pour communiquer avec le service Fleet Engine. Pour en savoir plus sur les jetons attendus par Serveur Fleet Engine, consultez la page Jetons Web JSON et Émettre des jetons Web JSON.

Le jeton d'autorisation permet d'accéder aux services Fleet Engine suivants :

  • TripService : permet au SDK grand public d'accéder aux détails du trajet, y compris la position, l'itinéraire et l'heure d'arrivée prévue du véhicule. Jetons d'autorisation pour le service de trajet doit inclure une revendication tripid:TRIP_ID dans l'en-tête authorization du jeton ; où TRIP_ID est l'identifiant du trajet à la demande partagé.

  • VehicleService : fournit au SDK grand public des informations sur le la position approximative du véhicule pour afficher le calque de densité des véhicules pour estimer l'heure d'arrivée prévue des points retrait. Étant donné que le SDK Consumer n'utilise que des positions approximatives, les jetons d'autorisation pour le service de véhicule ne nécessitent pas de revendication vehicleid.

Qu'est-ce qu'un jeton ?

Pour les appels de méthode API à partir d'environnements à faible confiance, Fleet Engine requiert l'utilisation de jetons Web JSON (JWT) signés par un compte de service approprié ; Les environnements à faible confiance incluent les smartphones et les navigateurs. Un jeton JWT proviennent de votre serveur, qui est un environnement entièrement approuvé. Le jeton JWT est signé, chiffré et transmis au client pour le serveur suivant jusqu'à ce qu'il expire ou qu'il ne soit plus valide.

Votre backend doit s'authentifier et s'autoriser auprès de Fleet Engine à l'aide des mécanismes standards des identifiants par défaut de l'application. Marque veillez à utiliser des jetons JWT signés par un compte de service approprié. Pour une liste des rôles de compte de service, consultez la page Rôles de compte de service Fleet Engine du cours sur les principes de base des moteurs de flotte.

À l'inverse, votre backend doit s'authentifier et autoriser l'accès à Fleet Engine à l'aide des identifiants par défaut de l'application standards. des mécanismes de sécurité.

Pour en savoir plus sur les jetons Web JSON, consultez la section Jetons Web JSON de Fleet Engine Essentials (Principes de base des moteurs de flotte)

Comment les clients obtiennent-ils des jetons ?

Une fois qu'un pilote ou un client se connecte à votre application à l'aide de la clé identifiants d'autorisation, les mises à jour émises à partir de cet appareil doivent utiliser les jetons d'autorisation appropriés, qui communiquent à Fleet Engine les autorisations de l'application.

En tant que développeur, votre implémentation client doit permettre d'effectuer les éléments suivants:

  • Récupérez un jeton Web JSON sur votre serveur.
  • Réutilisez le jeton jusqu'à son expiration pour réduire son actualisation.
  • Actualisez le jeton lorsqu'il expire.

La classe AuthTokenFactory génère des jetons d'autorisation lors de la mise à jour de la position. en temps réel. Le SDK doit empaqueter les jetons d'informations à envoyer à Fleet Engine. Assurez-vous que votre serveur côté serveur peut émettre des jetons avant d'initialiser le SDK.

Pour en savoir plus sur les jetons attendus par le service Fleet Engine, consultez la section Émettre un fichier JSON Jetons Web pour Fleet Engine

Exemple d'outil de récupération de jetons d'autorisation

L'exemple de code suivant montre comment implémenter un jeton d'autorisation .

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
    }
  }
}

Étape suivante

Initialiser le SDK client