Autorisierungstokens abrufen

Das Consumer SDK bietet eine Autorisierung mit JSON-Webtokens. Ein JSON Web Token (JWT) ist ein Autorisierungstoken, das eine oder mehrere Ansprüche auf einen Dienst enthält.

Das Consumer SDK verwendet das von der Anwendung bereitgestellte JSON Web Token, um mit der Fleet Engine zu kommunizieren. Details zu den vom Fleet Engine-Server erwarteten Tokens finden Sie unter JSON-Webtokens und JSON-Webtokens ausstellen.

Das Autorisierungstoken gewährt Zugriff auf die folgenden Fleet Engine-Dienste:

  • TripService: Hiermit erhält das Consumer SDK Zugriff auf Fahrtdetails, einschließlich Fahrzeugposition, Route und geschätzter Ankunftszeit. Autorisierungstokens für den Fahrtdienst müssen im authorization-Header des Tokens eine tripid:TRIP_ID-Anforderung enthalten. Dabei ist TRIP_ID die Fahrt-ID der freigegebenen Fahrt auf Abruf.

  • VehicleService: Gibt dem Consumer SDK Informationen zum ungefähren Standort des Fahrzeugs, um die Fahrzeugdichteebene anzuzeigen und die geschätzte Ankunftszeit am Abholpunkt zu ermitteln. Da das Consumer SDK nur ungefähre Standorte verwendet, ist für Autorisierungstokens für den Fahrzeugdienst kein vehicleid-Anspruch erforderlich.

Was ist ein Token?

Für API-Methodenaufrufe aus Umgebungen mit geringem Vertrauen erfordert die Fleet Engine die Verwendung von JSON Web Tokens (JWTs), die von einem geeigneten Dienstkonto signiert wurden. Beispiele für Umgebungen mit geringem Vertrauen sind Smartphones und Browser. Ein JWT stammt von deinem Server, einer vollkommen vertrauenswürdigen Umgebung. Das JWT wird signiert, verschlüsselt und für nachfolgende Serverinteraktionen an den Client übergeben, bis es abläuft oder nicht mehr gültig ist.

Ihr Backend sollte sich mithilfe der standardmäßigen Mechanismen für Standardanmeldedaten für Anwendungen bei der Fleet Engine authentifizieren und autorisieren. Verwenden Sie JWTs, die von einem geeigneten Dienstkonto signiert wurden. Eine Liste der Dienstkontorollen finden Sie unter Fleet Engine-Dienstkontorollen in Fleet Engine – Grundlagen.

Ihr Backend sollte sich dagegen mithilfe der standardmäßigen Standardanmeldedaten für Anwendungen bei der Fleet Engine authentifizieren und autorisieren.

Weitere Informationen zu JSON Web Tokens finden Sie unter JSON Web Tokens im Artikel Fleet Engine Essentials.

Wie erhalten Kunden Tokens?

Sobald sich ein Fahrer oder Nutzer mit den entsprechenden Autorisierungsdaten in Ihrer App anmeldet, müssen alle von diesem Gerät ausgegebenen Updates die entsprechenden Autorisierungstokens verwenden, die der Fleet Engine die Berechtigungen für die App mitteilen.

Als Entwickler sollte Ihre Clientimplementierung Folgendes ermöglichen:

  • Rufe ein JSON Web Token von deinem Server ab.
  • Wiederverwenden Sie das Token, bis es abläuft, um die Anzahl der Tokenaktualisierungen zu minimieren.
  • Aktualisieren Sie das Token, wenn es abläuft.

Die AuthTokenFactory-Klasse generiert Autorisierungstokens zum Zeitpunkt der Standortaktualisierung. Das SDK muss die Tokens mit den Aktualisierungsinformationen verpacken, die an die Fleet Engine gesendet werden. Prüfen Sie, ob Ihre serverseitige Implementierung Tokens ausstellen kann, bevor Sie das SDK initialisieren.

Weitere Informationen zu den vom Fleet Engine-Dienst erwarteten Tokens finden Sie unter JSON-Webtokens ausstellen für Fleet Engine.

Beispiel für einen Autorisierungstoken-Abruf

Im folgenden Codebeispiel wird gezeigt, wie ein Autorisierungstoken-Callback implementiert wird.

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

Nächste Schritte

Consumer SDK initialisieren