Autorisierungstokens abrufen

Das Consumer SDK bietet Autorisierungen mithilfe von JSON Web Tokens. 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 Fahrdienst müssen im authorization-Header des Tokens die Anforderung tripid:TRIP_ID enthalten, wobei TRIP_ID die Fahrt-ID der geteilten Fahrt bei Bedarf ist.

  • 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, sind für Autorisierungstokens für den Fahrzeugdienst keine vehicleid-Anspruche erforderlich.

Was ist ein Token?

Für API-Methodenaufrufe aus Umgebungen mit geringem Vertrauen benötigt Fleet Engine die Verwendung von JSON-Webtokens (JWTs), die von einem entsprechenden Dienstkonto signiert sind. Zu den Umgebungen mit wenig Vertrauen gehören 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 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 in Fleet Engine Essentials.

Wie erhalten Clients 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 Tokenaktualisierungen zu minimieren.
  • Aktualisieren Sie das Token, wenn es abläuft.

Die Klasse AuthTokenFactory generiert Autorisierungstokens bei 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 für Fleet Engine ausgeben.

Beispiel für einen Abrufer von Autorisierungstokens

Das folgende Codebeispiel zeigt, 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