Yetkilendirme jetonları alma

Tüketici SDK'sı, JSON Web Jetonları kullanarak yetkilendirme sağlar. JSON Web Token (JWT), bir hizmetle ilgili bir veya daha fazla hak talebi sağlayan bir yetkilendirme jetonudur.

Tüketici SDK'sı, Fleet Engine ile iletişim kurmak için uygulama tarafından sağlanan JSON Web Jetonu'nu kullanır. Fleet Engine sunucusunun beklediği jetonlarla ilgili ayrıntılar için JSON Web Jetonları ve JSON Web jetonu yayınlama başlıklı makalelere bakın.

Yetkilendirme jetonu aşağıdaki Fleet Engine hizmetlerine erişim sağlar:

  • TripService: Tüketici SDK'sına araç konumu, rota ve tahmini varış zamanı dahil olmak üzere seyahat ayrıntılarına erişim izni verir. Seyahat hizmetinin yetkilendirme jetonları, jetonun authorization başlığında bir tripid:TRIP_ID hak talebi içermelidir. Burada TRIP_ID, paylaşılan isteğe bağlı seyahatin seyahat kimliğidir.

  • VehicleService: Tüketici SDK'sına, araç yoğunluğu katmanını görüntülemek ve teslim alma noktası tahmini varış zamanını hesaplamak için yaklaşık araç konumu hakkında bilgi verir. Tüketici SDK'sı yalnızca yaklaşık konumları kullandığından, araç hizmeti için yetkilendirme jetonları vehicleid hak talebi gerektirmez.

Jeton nedir?

Güvenilirliği düşük ortamlardan gelen API yöntemi çağrıları için Fleet Engine, uygun bir hizmet hesabı tarafından imzalanan JSON Web Jetonları'nın (JWT'ler) kullanılmasını gerektirir. Güven düzeyi düşük ortamlar arasında akıllı telefonlar ve tarayıcılar bulunur. JWT, tamamen güvenilir bir ortam olan sunucunuzda bir JWT kaynaklıdır. JWT imzalanır, şifrelenir ve geçerliliği sona erene kadar veya geçerliliğini yitirene kadar sonraki sunucu etkileşimleri için istemciye iletilir.

Arka ucunuz, standart Uygulama Varsayılan Kimlik Bilgileri mekanizmalarını kullanarak Fleet Engine'e karşı kimlik doğrulamalı ve yetkilendirmelidir. Uygun bir hizmet hesabı tarafından imzalanan JWT'leri kullandığınızdan emin olun. Hizmet hesabı rollerinin listesi için Fleet Engine'in Temel Özellikleri başlıklı makalenin Fleet Engine hizmet hesabı rolleri bölümüne bakın.

Buna karşılık, arka uçunuz standart uygulama varsayılan kimlik bilgileri mekanizmalarını kullanarak Fleet Engine'e karşı kimlik doğrulaması ve yetkilendirme yapmalıdır.

JSON Web Jetonları hakkında daha fazla bilgi için Fleet Engine Essentials'daki JSON Web Jetonları'na bakın.

Müşteriler jetonları nasıl alır?

Bir sürücü veya tüketici uygun yetkilendirme kimlik bilgilerini kullanarak uygulamanızda oturum açtığında, bu cihazdan yayınlanan tüm güncellemelerin uygun yetkilendirme jetonlarını kullanması gerekir. Bu jetonlar, Fleet Engine'e uygulamanın izinlerini iletir.

Geliştirici olarak, istemci uygulamanız aşağıdakileri yapma olanağı sağlamalıdır:

  • Sunucunuzdan bir JSON Web Token'u alın.
  • Jeton yenilemelerini en aza indirmek için jetonu süresi dolana kadar yeniden kullanın.
  • Jetonu süresi dolduğunda yenileyin.

AuthTokenFactory sınıfı, konum güncelleme zamanında yetkilendirme jetonları oluşturur. SDK, jetonları Fleet Engine'e gönderilecek güncelleme bilgileriyle birlikte paketlemelidir. SDK'yı başlatmadan önce sunucu tarafı uygulamanızın jeton yayınlayabileceğinden emin olun.

Fleet Engine hizmeti tarafından beklenen jetonlarla ilgili ayrıntılar için Fleet Engine için Issue JSON Web Jetonları bölümüne bakın.

Yetkilendirme jetonu getirme aracı örneği

Aşağıdaki kod örneğinde, yetkilendirme jetonu geri çağırma işleminin nasıl uygulanacağı gösterilmektedir.

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

Sırada ne var?

Consumer SDK'sını başlatma