Autorisierungstokens abrufen

Das Consumer SDK bietet eine Autorisierung mit JSON Web Tokens. Ein JSON Web Token (JWT) ist ein Autorisierungstoken, das einen oder mehrere Ansprüche für einen Dienst bereitstellt.

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

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

  • TripService: Gewährt dem Consumer SDK Zugriff auf Fahrtdetails, einschließlich Fahrzeugposition, Route und voraussichtlicher Ankunftszeit. Autorisierungstokens für den Fahrtdienst müssen im authorization-Header des Tokens eine tripid:TRIP_ID-Anforderung enthalten, wobei TRIP_ID die Fahrt-ID der geteilten On-Demand-Fahrt ist.

  • VehicleService: Gibt dem Consumer SDK Informationen zur ungefähren Fahrzeugposition, um die Ebene für die Fahrzeugdichte anzuzeigen und die voraussichtliche Ankunftszeit am Abholort zu schätzen. 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?

Die Fleet Engine erfordert die Verwendung von JSON Web Tokens (JWTs) für API-Methodenaufrufe aus weniger vertrauenswürdigen Umgebungen: Smartphones und Browsern.

Ein JWT stammt von Ihrem Server, wird signiert, verschlüsselt und für nachfolgende Serverinteraktionen an den Client übergeben, bis es abläuft oder nicht mehr gültig ist.

Wichtige Details

Weitere Informationen zu JSON Web Tokens finden Sie unter JSON Web Tokens in den Grundlagen zur Fleet Engine.

Wie erhalten Clients Tokens?

Sobald sich ein Fahrer oder Verbraucher mit den entsprechenden Autorisierungsdaten in Ihrer App anmeldet, müssen für alle von diesem Gerät ausgegebenen Aktualisierungen die entsprechenden Autorisierungstokens verwendet werden. Dadurch werden die Berechtigungen für die App an die Fleet Engine übermittelt.

Als Entwickler sollte Ihre Clientimplementierung Folgendes ermöglichen:

  • Rufen Sie ein JSON Web Token von Ihrem Server ab.
  • Verwenden Sie das Token so lange, bis es abläuft, um Tokenaktualisierungen zu minimieren.
  • Aktualisieren Sie das Token, wenn es abläuft.

Die Klasse AuthTokenFactory generiert Autorisierungstokens, wenn der Standort aktualisiert wird. Das SDK muss die Tokens mit den Update-Informationen verpacken, die an Fleet Engine gesendet werden sollen. Achten Sie darauf, dass Ihre serverseitige Implementierung Tokens ausgeben kann, bevor Sie das SDK initialisieren.

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

Beispiel für einen Autorisierungstoken-Fetcher

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