Nhận mã thông báo uỷ quyền

SDK người tiêu dùng thực hiện uỷ quyền bằng Mã thông báo web JSON. Mã thông báo web JSON (JWT) là mã thông báo uỷ quyền cung cấp một hoặc nhiều thông báo xác nhận quyền sở hữu đối với một dịch vụ.

SDK người tiêu dùng sử dụng Mã thông báo web JSON do ứng dụng cung cấp để giao tiếp với Fleet Engine. Để biết thông tin chi tiết về các mã thông báo mà Máy chủ Fleet Engine, hãy xem Mã thông báo web JSONPhát hành mã thông báo Web JSON.

Mã thông báo uỷ quyền cấp quyền truy cập vào các dịch vụ sau đây của Fleet Engine:

  • TripService – Cấp cho SDK người tiêu dùng quyền truy cập vào thông tin chi tiết về chuyến đi, bao gồm vị trí của xe, tuyến đường và giờ đến dự kiến. Mã thông báo uỷ quyền cho dịch vụ chuyến đi phải bao gồm thông báo xác nhận quyền sở hữu tripid:TRIP_ID trong tiêu đề authorization của mã thông báo, trong đó TRIP_ID là mã chuyến đi của chuyến đi theo yêu cầu đang được chia sẻ.

  • VehicleService – Cung cấp cho SDK người tiêu dùng thông tin về vị trí ước chừng của xe để hiển thị lớp mật độ xe và ước tính thời gian đến lấy hàng (ETA). Vì SDK người tiêu dùng chỉ sử dụng khoảng vị trí, mã uỷ quyền cho dịch vụ xe không yêu cầu Xác nhận quyền sở hữu vehicleid.

Mã thông báo là gì?

Đối với các lệnh gọi phương thức API từ môi trường tin cậy thấp, Fleet Engine yêu cầu việc sử dụng Mã thông báo web JSON (JWT) được ký bằng một tài khoản dịch vụ thích hợp. Môi trường đáng tin cậy thấp bao gồm điện thoại thông minh và trình duyệt. JWT bắt nguồn từ máy chủ của bạn – một môi trường hoàn toàn đáng tin cậy. JWT được ký, mã hoá và chuyển đến máy khách để máy chủ cho đến khi hết hạn hoặc không còn hợp lệ.

Phần phụ trợ của bạn phải xác thực và uỷ quyền dựa trên Fleet Engine bằng cách sử dụng cơ chế Thông tin đăng nhập mặc định của ứng dụng tiêu chuẩn. Hãy nhớ sử dụng JWT do một tài khoản dịch vụ thích hợp ký. Đối với danh sách vai trò trong tài khoản dịch vụ, hãy xem các vai trò trong tài khoản dịch vụ Fleet Engine trong Fleet Engine cơ bản.

Ngược lại, phần phụ trợ của bạn phải xác thực và uỷ quyền dựa trên Fleet Engine bằng Thông tin đăng nhập mặc định của ứng dụng tiêu chuẩn cơ chế cụ thể.

Để biết thêm thông tin về Mã thông báo web JSON, hãy xem phần Mã thông báo web JSON trong bài viết Kiến thức cơ bản về công cụ của Fleet.

Khách hàng nhận mã thông báo bằng cách nào?

Sau khi người lái xe hoặc người dùng đăng nhập vào ứng dụng của bạn bằng thông tin xác thực uỷ quyền, mọi bản cập nhật phát hành qua thiết bị đó đều phải sử dụng mã thông báo uỷ quyền thích hợp để thông báo cho Fleet Engine cho ứng dụng.

Với tư cách là nhà phát triển, việc triển khai cho khách hàng của bạn phải giúp bạn như sau:

  • Tìm nạp Mã thông báo web JSON qua máy chủ của bạn.
  • Hãy sử dụng lại mã thông báo cho đến khi hết hạn để giảm thiểu số lượt làm mới mã thông báo.
  • Làm mới mã thông báo khi mã này hết hạn.

Lớp AuthTokenFactory tạo mã thông báo uỷ quyền khi cập nhật vị trí bất cứ lúc nào. SDK phải đóng gói mã thông báo bằng bản cập nhật để gửi đến Fleet Engine. Đảm bảo rằng phía máy chủ của bạn có thể phát hành mã thông báo trước khi khởi chạy SDK.

Để biết thông tin chi tiết về các mã thông báo cần có cho dịch vụ Fleet Engine, hãy xem bài viết Vấn đề JSON Web Tokens cho Fleet Engine.

Ví dụ về trình tìm nạp mã thông báo uỷ quyền

Ví dụ về mã sau đây minh hoạ cách triển khai mã thông báo uỷ quyền .

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

Các bước tiếp theo

Khởi chạy SDK người tiêu dùng