الحصول على الرموز المميّزة للتفويض

توفّر حزمة تطوير البرامج (SDK) الخاصة بالمستهلك إذن الوصول باستخدام رموز JSON المميّزة للويب. رمز JSON المميّز للويب (JWT) هو رمز مميّز للتفويض يقدّم مطالبة واحدة أو أكثر بشأن خدمة معيّنة.

تستخدم حزمة تطوير البرامج (SDK) الخاصة بالمستهلك رمز JSON المميّز للويب الذي يوفّره التطبيق للتواصل مع Fleet Engine. للحصول على تفاصيل حول الرموز المميزة التي يتوقعها خادم Fleet Engine، راجِع رموز JSON المميزة للويب وإصدار رموز JSON المميزة للويب.

يوفّر رمز التفويض إمكانية الوصول إلى خدمات Fleet Engine التالية:

  • TripService: يمنح حزمة Consumer SDK إذن الوصول إلى تفاصيل الرحلة، بما في ذلك موقع المركبة ومسارها ووقت الوصول المقدَّر. يجب أن تتضمّن رموز إذن الوصول إلى خدمة الرحلات مطالبة tripid:TRIP_ID في عنوان authorization للرمز المميز، حيث يمثّل TRIP_ID رقم تعريف الرحلة عند الطلب التي تتم مشاركتها.

  • VehicleService: تقدّم هذه السمة إلى حزمة تطوير البرامج (SDK) المخصّصة للمستهلكين معلومات حول الموقع الجغرافي التقريبي للمركبة من أجل عرض طبقة كثافة المركبات وتقدير الوقت المقدَّر للوصول إلى نقطة الاستلام. بما أنّ حزمة تطوير البرامج (SDK) الخاصة بالمستهلك تستخدم المواقع الجغرافية التقريبية فقط، لا تتطلّب رموز المصادقة المميزة الخاصة بخدمة المركبة مطالبة vehicleid.

ما هي الرموز المميزة؟

تتطلّب Fleet Engine استخدام رموز JSON المميّزة للويب (JWT) لإجراء عمليات استدعاء طرق واجهة برمجة التطبيقات من البيئات ذات مستوى الثقة المنخفض: الهواتف الذكية والمتصفحات.

يتم إنشاء رمز JWT على الخادم الخاص بك، ويتم توقيعه وتشفيره وتمريره إلى العميل للتفاعلات اللاحقة مع الخادم إلى أن تنتهي صلاحيته أو يصبح غير صالح.

التفاصيل الأساسية

لمزيد من المعلومات حول رموز JSON المميّزة للويب، راجِع رموز JSON المميّزة للويب في أساسيات Fleet Engine.

كيف يحصل العملاء على الرموز المميزة؟

بعد أن يسجّل السائق أو المستهلك الدخول إلى تطبيقك باستخدام بيانات اعتماد التفويض المناسبة، يجب أن تستخدم أي تحديثات صادرة من هذا الجهاز رموز تفويض مناسبة، ما يوضّح لخدمة Fleet Engine أذونات التطبيق.

بصفتك المطوّر، يجب أن يوفّر تنفيذ العميل إمكانية إجراء ما يلي:

  • استرجِع رمز JSON المميّز للويب من الخادم.
  • أعِد استخدام الرمز المميز إلى أن تنتهي صلاحيته لتقليل عمليات إعادة تحميل الرموز المميزة.
  • أعِد تحميل الرمز المميز عند انتهاء صلاحيته.

تنشئ الفئة AuthTokenFactory رموزًا مميزة للتفويض عند تعديل الموقع الجغرافي. يجب أن تحزّم حزمة SDK الرموز المميّزة مع معلومات التعديل لإرسالها إلى Fleet Engine. تأكَّد من أنّ عملية التنفيذ من جهة الخادم يمكنها إصدار الرموز المميزة قبل إعداد حزمة تطوير البرامج (SDK).

للحصول على تفاصيل حول الرموز المميزة التي تتوقّعها خدمة Fleet Engine، يمكنك الاطّلاع على إصدار رموز الويب المميزة JSON لخدمة Fleet Engine.

مثال على أداة جلب رمز مميز للتفويض

يوضّح مثال الرمز البرمجي التالي كيفية تنفيذ معاودة الاتصال الخاصة برمز التفويض.

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

الخطوات التالية

إعداد حزمة Consumer SDK