取得授權權杖

什麼是符記?

Fleet Engine 要求使用 JSON Web Token (JWT) 來呼叫來自信任程度較低的環境 (智慧型手機和瀏覽器) 的 API 方法。

JWT 會在您的伺服器上產生,並經過簽署和加密,然後傳遞至用戶端,以便在後續的伺服器互動中使用,直到過期或不再有效為止。

重要詳細資料

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

用戶端如何取得權杖?

駕駛員或消費者使用適當的授權憑證登入應用程式後,從該裝置發出的任何更新都必須使用適當的授權權杖,以便向 Fleet Engine 傳達應用程式的權限。

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

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

AuthTokenFactory 類別會在位置更新時產生授權權杖。SDK 必須將符記與更新資訊封裝,才能傳送至 Fleet Engine。請務必在初始化 SDK 之前,確認伺服器端實作項目可以發出權杖。

如要進一步瞭解 Fleet Engine 服務所需的權杖,請參閱 Fleet Engine 的「發出 JSON Web 權杖」一文。

授權權杖擷取器範例

以下是 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