รับโทเค็นการให้สิทธิ์

Consumer SDK จะให้สิทธิ์โดยใช้ JSON Web Token JSON Web Token (JWT) เป็นโทเค็นการให้สิทธิ์ที่มีการอ้างสิทธิ์อย่างน้อย 1 รายการในบริการ

Consumer SDK ใช้โทเค็นเว็บ JSON ที่แอปพลิเคชันระบุเพื่อสื่อสารกับ Fleet Engine โปรดดูรายละเอียดโทเค็นที่เซิร์ฟเวอร์ Fleet Engine คาดหวังได้ที่โทเค็นเว็บ JSON และออกโทเค็นเว็บ JSON

โทเค็นการให้สิทธิ์จะให้สิทธิ์เข้าถึงบริการ Fleet Engine ต่อไปนี้

  • TripService - ให้สิทธิ์ Consumer SDK เข้าถึงรายละเอียดการเดินทาง ซึ่งรวมถึงตำแหน่งของยานพาหนะ เส้นทาง และเวลาถึงโดยประมาณ โทเค็นการให้สิทธิ์สำหรับบริการการเดินทางต้องมีการอ้างสิทธิ์ tripid:TRIP_ID ในส่วนหัว authorization ของโทเค็น โดยที่ TRIP_ID คือรหัสการเดินทางของการเดินทางแบบออนดีมานด์ที่แชร์อยู่

  • VehicleService - ให้ข้อมูล SDK สำหรับผู้บริโภคเกี่ยวกับตำแหน่งโดยประมาณของรถเพื่อแสดงเลเยอร์ความหนาแน่นของยานพาหนะและการประมาณเวลาถึงโดยประมาณของจุดรับสินค้า เนื่องจาก Consumer SDK ใช้ตำแหน่งโดยประมาณเท่านั้น โทเค็นการให้สิทธิ์สำหรับบริการยานพาหนะจึงไม่จำเป็นต้องมีการอ้างสิทธิ์vehicleid

โทเค็นคืออะไร

สําหรับการเรียกใช้เมธอด API จากสภาพแวดล้อมที่มีระดับความน่าเชื่อถือต่ำ Fleet Engine จะกำหนดให้ใช้ JSON Web Token (JWT) ที่ลงนามโดยบัญชีบริการที่เหมาะสม สภาพแวดล้อมที่มีระดับความน่าเชื่อถือต่ำ ได้แก่ สมาร์ทโฟนและเบราว์เซอร์ JWT จะเริ่มต้นจากเซิร์ฟเวอร์ของคุณ ซึ่งเป็นสภาพแวดล้อมที่เชื่อถือได้โดยสมบูรณ์ JWT จะได้รับการลงนาม เข้ารหัส และส่งไปยังไคลเอ็นต์สำหรับการโต้ตอบของเซิร์ฟเวอร์ในครั้งต่อๆ ไปจนกว่าไฟล์จะหมดอายุหรือใช้งานไม่ได้อีกต่อไป

แบ็กเอนด์ควรตรวจสอบสิทธิ์และอนุญาตกับ Fleet Engine โดยใช้กลไกข้อมูลเข้าสู่ระบบเริ่มต้นของแอปพลิเคชันมาตรฐาน อย่าลืมใช้ JWT ที่ลงนามโดยบัญชีบริการที่เหมาะสม ดูรายการบทบาทของบัญชีบริการได้ที่บทบาทบัญชีบริการของ Fleet Engine ในข้อมูลเบื้องต้นเกี่ยวกับ Fleet Engine

ในทางกลับกัน แบ็กเอนด์ควรตรวจสอบสิทธิ์และให้สิทธิ์กับ Fleet Engine โดยใช้กลไกข้อมูลเข้าสู่ระบบเริ่มต้นของแอปพลิเคชันมาตรฐาน

ดูข้อมูลเพิ่มเติมเกี่ยวกับ JSON Web Token ได้ที่ JSON Web Token ใน Fleet Engine Essentials

ลูกค้าจะได้รับโทเค็นได้อย่างไร

เมื่อคนขับหรือผู้บริโภคเข้าสู่ระบบแอปโดยใช้ข้อมูลเข้าสู่ระบบการให้สิทธิ์ที่เหมาะสม การอัปเดตที่ดำเนินการจากอุปกรณ์นั้นต้องใช้โทเค็นการให้สิทธิ์ที่เหมาะสม ซึ่งจะสื่อสารสิทธิ์สำหรับแอปกับ Fleet Engine

ในฐานะนักพัฒนาซอฟต์แวร์ การติดตั้งใช้งานไคลเอ็นต์ควรทําสิ่งต่อไปนี้ได้

  • เรียก JSON Web Token จากเซิร์ฟเวอร์ของคุณ
  • ใช้โทเค็นซ้ำจนกว่าจะหมดอายุเพื่อลดการรีเฟรชโทเค็น
  • รีเฟรชโทเค็นเมื่อหมดอายุ

คลาส 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