取得授權權杖

什麼是權杖?

對於從低信任環境發出的 API 方法呼叫,Fleet Engine 必須使用適當服務帳戶簽署的 JSON Web Token (JWT)。信任度低的環境包括智慧型手機和瀏覽器。JWT 會在伺服器上產生,而伺服器是完全信任的環境。JWT 會經過簽署和加密並傳遞至用戶端,以便進行後續的伺服器互動,直到過期或失效為止。

您的後端應使用標準應用程式預設憑證機制,對 Fleet Engine 進行驗證和授權。請務必使用經過適當服務帳戶簽署的 JWT。如需服務帳戶角色清單,請參閱「Fleet Engine 基礎知識」中的Fleet Engine 服務帳戶角色。

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

如要進一步瞭解 JSON Web Token,請參閱 Fleet Engine Essentials 中的 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