Mendapatkan token otorisasi

Consumer SDK memberikan otorisasi menggunakan JSON Web Token. JSON Web Token (JWT) adalah token otorisasi yang memberikan satu atau beberapa klaim pada layanan.

Consumer SDK menggunakan Token Web JSON yang disediakan oleh aplikasi untuk berkomunikasi dengan Fleet Engine. Untuk mengetahui detail token yang diharapkan oleh server Fleet Engine, lihat JSON Web Token dan Mengeluarkan token Web JSON.

Token otorisasi memberikan akses ke layanan Fleet Engine berikut:

  • TripService - Memberikan akses Consumer SDK ke detail perjalanan, termasuk posisi kendaraan, rute, dan perkiraan waktu tiba. Token otorisasi untuk layanan perjalanan harus menyertakan klaim tripid:TRIP_ID di header authorization token, dengan TRIP_ID adalah ID perjalanan dari perjalanan on-demand yang dibagikan.

  • VehicleService - Memberikan informasi Consumer SDK tentang perkiraan lokasi kendaraan untuk menampilkan lapisan kepadatan kendaraan dan memperkirakan perkiraan waktu tiba (ETA) titik penjemputan. Karena Consumer SDK hanya menggunakan perkiraan lokasi, token otorisasi untuk layanan kendaraan tidak memerlukan klaim vehicleid.

Apa yang dimaksud dengan token?

Fleet Engine mewajibkan penggunaan Token Web JSON (JWT) untuk panggilan metode API dari lingkungan dengan tingkat kepercayaan rendah: smartphone dan browser.

JWT berasal dari server Anda, ditandatangani, dienkripsi, dan diteruskan ke klien untuk interaksi server berikutnya hingga masa berlakunya habis atau tidak lagi valid.

Detail utama

Untuk informasi selengkapnya tentang Token Web JSON, lihat Token Web JSON di Dasar-Dasar Fleet Engine.

Bagaimana cara klien mendapatkan token?

Setelah pengemudi atau konsumen login ke aplikasi Anda menggunakan kredensial otorisasi yang sesuai, setiap update yang dikeluarkan dari perangkat tersebut harus menggunakan token otorisasi yang sesuai, yang menyampaikan izin untuk aplikasi ke Fleet Engine.

Sebagai developer, implementasi klien Anda harus memberikan kemampuan untuk melakukan hal berikut:

  • Ambil Token Web JSON dari server Anda.
  • Gunakan kembali token hingga masa berlakunya habis untuk meminimalkan refresh token.
  • Muat ulang token saat masa berlakunya habis.

Class AuthTokenFactory menghasilkan token otorisasi pada waktu pembaruan lokasi. SDK harus memaketkan token dengan informasi update yang akan dikirim ke Fleet Engine. Pastikan implementasi sisi server Anda dapat menerbitkan token sebelum melakukan inisialisasi SDK.

Untuk mengetahui detail token yang diharapkan oleh layanan Fleet Engine, lihat Mengeluarkan Token Web JSON untuk Fleet Engine.

Contoh pengambil token otorisasi

Contoh kode berikut menunjukkan cara menerapkan callback token otorisasi.

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

Langkah berikutnya

Melakukan inisialisasi Consumer SDK