קבלת אסימוני הרשאה

ה-Consumer SDK מספק הרשאה באמצעות אסימוני אינטרנט בפורמט JSON. אסימון אינטרנט בפורמט JSON‏ (JWT) הוא אסימון הרשאה שמספק הצהרה אחת או יותר על שירות.

ה-SDK של הצרכן משתמש באסימון האינטרנט מסוג JSON שסופק על ידי האפליקציה כדי לתקשר עם Fleet Engine. פרטים על האסימונים ששרת Fleet Engine מצפה להם מפורטים במאמרים אסימוני אינטרנט מסוג JSON והנפקה של אסימוני אינטרנט מסוג JSON.

אסימון ההרשאה מספק גישה לשירותים הבאים של Fleet Engine:

  • TripService – הרשאה שמעניקה ל-SDK של הצרכן גישה לפרטי הנסיעה, כולל המיקום של הרכב, המסלול והשעה המשוערת של ההגעה. אסימוני ההרשאה של שירות הנסיעה חייבים לכלול הצהרת tripid:TRIP_ID בכותרת authorization של האסימון, כאשר TRIP_ID הוא מזהה הנסיעה של הנסיעה על פי דרישה ששותפה.

  • VehicleService – מעביר ל-Consumer SDK מידע על המיקום המשוער של הרכב, כדי להציג את שכבת צפיפות הרכבים ולחשב את זמני ההגעה המשוערים לנקודת האיסוף. מכיוון ש-Consumer SDK משתמש רק במיקומים משוערים, לא נדרשת הצהרת vehicleid כדי להשתמש באסימוני ההרשאה של שירות הרכב.

מהו אסימון?

ב-Fleet Engine נדרש שימוש באסימוני JWT (JSON Web Tokens) לקריאות ל-method של API מסביבות עם רמת אמון נמוכה: סמארטפונים ודפדפנים.

אסימון JWT נוצר בשרת, נחתם, מוצפן ומועבר ללקוח לצורך אינטראקציות עתידיות עם השרת, עד שתוקף האסימון יפוג או שהוא לא יהיה בתוקף יותר.

פרטי המפתח

למידע נוסף על אסימוני JSON Web, ראו JSON Web Tokens בקטע יסודות של Fleet Engine.

איך לקוחות מקבלים אסימונים?

אחרי שהנהג או הצרכן נכנסים לאפליקציה באמצעות פרטי הכניסה המתאימים, כל עדכון שיישלח מהמכשיר הזה חייב להשתמש באסימוני הרשאה מתאימים, שמעבירים ל-Fleet Engine את ההרשאות לאפליקציה.

כמפתחים, ההטמעה של הלקוח צריכה לספק את היכולת לבצע את הפעולות הבאות:

  • אחזור אסימון רשת מבוסס JSON מהשרת.
  • כדאי לעשות שימוש חוזר באסימון עד שתוקף התוקף שלו יפוג, כדי לצמצם את מספר הרענונים של האסימון.
  • מרעננים את הטוקן כשפג התוקף שלו.

הכיתה AuthTokenFactory יוצרת אסימוני הרשאה בזמן עדכון המיקום. ה-SDK צריך לארוז את האסימונים עם פרטי העדכון כדי לשלוח אותם ל-Fleet Engine. לפני שמפעילים את ה-SDK, צריך לוודא שההטמעה בצד השרת יכולה להנפיק אסימונים.

פרטים על האסימונים ששירות Fleet Engine מצפה להם מפורטים במאמר הנפקת אסימוני אינטרנט מסוג JSON בנושא Fleet Engine.

דוגמה לאחזור של אסימון הרשאה

דוגמת הקוד הבאה מראה איך להטמיע קריאה חוזרת (callback) של אסימון הרשאה.

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