取得授權權杖

什麼是符記?

對於從低信任環境發出的 API 方法呼叫,Fleet Engine 會規定 使用由適當服務帳戶簽署的 JSON Web Token (JWT)。 低信任的環境包括智慧型手機和瀏覽器。JWT 會在伺服器上產生,而伺服器是完全信任的環境。系統會為 JWT 簽署、加密,並將其傳遞給用戶端,以便後續的伺服器互動,直到 JWT 到期或不再有效為止。

後端應使用標準的應用程式預設憑證機制,針對 Fleet Engine 進行驗證和授權。廠牌 請務必使用適當服務帳戶簽署的 JWT。換 服務帳戶角色清單,請參閱 Fleet Engine 服務帳戶角色 詳情請參閱 Fleet Engine 基本概念一文。

相反地,後端應使用標準的應用程式預設憑證機制,針對 Fleet Engine 進行驗證及授權。

如要進一步瞭解 JSON Web Token,請參閱 Fleet Engine 重點中的「JSON Web Token」。

用戶端如何取得權杖?

駕駛或消費者使用適當的 授權憑證,凡是從該裝置發出的更新都必須使用 取得適當的授權權杖,向 Fleet Engine 和 授予所需的應用程式權限

身為開發人員,您的用戶端實作項目應提供以下功能:

  • 從伺服器擷取 JSON Web Token。
  • 在權杖到期前重複使用,盡量減少權杖重新整理次數。
  • 在權杖到期時重新整理。

AuthTokenFactory 類別會在位置更新時產生授權權杖 讓應用程式從可以最快做出回應的位置 回應使用者要求SDK 必須將符記與更新資訊封裝,才能傳送至 Fleet Engine。請確認伺服器端實作項目可以在初始化 SDK 之前發出權杖。

如要進一步瞭解 Fleet Engine 服務預期的權杖,請參閱核發 JSON Fleet Engine 適用的網路權杖

授權權杖擷取工具範例

以下是 AuthTokenFactory 的骨架實作:

class JsonAuthTokenFactory implements AuthTokenFactory {
  private String vehicleServiceToken;  // initially null
  private long expiryTimeMs = 0;
  private String vehicleId;

  // This method is called on a thread whose only responsibility is to send
  // location updates. Blocking is OK, but just know that no location updates
  // can occur until this method returns.
  @Override
  public String getToken(AuthTokenContext authTokenContext) {
    String vehicleId = requireNonNull(context.getVehicleId());

    if (System.currentTimeMillis() > expiryTimeMs || !vehicleId.equals(this.vehicleId)) {
      // The token has expired, go get a new one.
      fetchNewToken(vehicleId);
    }

    return vehicleServiceToken;
  }

  private void fetchNewToken(String vehicleId) {
    String url = "https://yourauthserver.example/token/" + vehicleId;

    try (Reader r = new InputStreamReader(new URL(url).openStream())) {
      com.google.gson.JsonObject obj
          = com.google.gson.JsonParser.parseReader(r).getAsJsonObject();
      vehicleServiceToken = obj.get("VehicleServiceToken").getAsString();
      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 10 minutes from that time.
      expiryTimeMs -= 10 * 60 * 1000;
      this.vehicleId = vehicleId;
    } catch (IOException e) {
      // It's OK to throw exceptions here. The StatusListener you passed to
      // create the DriverContext class will be notified and passed along the failed
      // update warning.
      throw new RuntimeException("Could not get auth token", e);
    }
  }
}

這個特定實作會使用內建的 Java HTTP 用戶端,擷取 權杖的 JSON 格式,藉此取得授權。用戶端儲存 ,並在權杖產生後 10 分鐘內重新擷取權杖,以便重複使用及重新擷取權杖 到期時間。

實作項目可能會有不同,例如使用背景執行緒 重新整理符記

如要瞭解可用的 Fleet Engine 用戶端程式庫,請參閱 適用於排程工作服務的用戶端程式庫

後續步驟

初始化 Driver SDK