Mendapatkan token otorisasi

Consumer SDK memberikan otorisasi menggunakan Token Web JSON. Token Web JSON (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 detail tentang token yang diharapkan oleh Server Fleet Engine, lihat Token Web JSON dan Menerbitkan token Web JSON.

Token otorisasi memberikan akses ke layanan Fleet Engine berikut:

  • TripService - Memberi Consumer SDK akses ke detail perjalanan, termasuk posisi kendaraan, rute, dan PWT. 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 kepada Consumer SDK tentang perkiraan lokasi kendaraan untuk menampilkan lapisan kepadatan kendaraan dan memperkirakan PWT titik pengambilan. Karena Consumer SDK hanya menggunakan perkiraan token otorisasi untuk layanan kendaraan tidak memerlukan vehicleid klaim.

Apa itu token?

Fleet Engine memerlukan penggunaan Token Web JSON (JWT) yang ditandatangani oleh akun layanan yang sesuai untuk panggilan metode API dari low-trust lingkungan fleksibel. Lingkungan kepercayaan rendah mencakup smartphone dan browser. JWT berasal dari server Anda, yang merupakan lingkungan yang sepenuhnya tepercaya. JWT ditandatangani, dienkripsi, dan diteruskan ke klien untuk selanjutnya interaksi hingga kedaluwarsa atau tidak lagi valid.

Backend Anda harus melakukan autentikasi dan otorisasi terhadap Fleet Engine menggunakan mekanisme Kredensial Default Aplikasi standar. Merek pastikan untuk menggunakan JWT yang telah ditandatangani oleh akun layanan yang sesuai. Untuk daftar peran akun layanan, lihat peran akun layanan Fleet Engine di Dasar-Dasar Armada Engine.

Untuk informasi selengkapnya tentang Token Web JSON, lihat Token Web JSON di Dasar-Dasar Mesin Perlengkapan.

Bagaimana cara klien mendapatkan token?

Setelah pengemudi atau konsumen login ke aplikasi Anda menggunakan kredensial otorisasi, setiap pembaruan yang dikeluarkan dari perangkat itu harus menggunakan token otorisasi yang sesuai, yang mengomunikasikan ke Fleet Engine izin akses untuk aplikasi.

Sebagai pengembang, penerapan klien Anda harus memberikan kemampuan untuk melakukan hal berikut:

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

Class AuthTokenFactory membuat token otorisasi saat pembaruan lokasi baik. SDK harus memaketkan token dengan update untuk dikirim ke Fleet Engine. Pastikan sisi server Anda dapat mengeluarkan token sebelum menginisialisasi SDK.

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

Contoh pengambil token otorisasi

Contoh kode berikut menunjukkan cara menerapkan 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

Menginisialisasi Consumer SDK