使用 On-Demand Services API 存取 AEM Mobile 的系列和產品詳細資訊

需求

必備知識

必要產品

  • Adobe AEM Mobile
  • On-Demand Services API 的存取權

簡介

這篇文章將涵蓋使用 AEM Mobile On-Demand Services API 來擷取產品和系列資訊。這項資訊可以用來提供資料給直接權益伺服器以控制內容授權。AEM Mobile 與 Digital Publishing Suite 使用相同的 Direct Entitlement API。這表示所有根據 Direct Entitlement API v2 的直接權益服務實作都與 AEM Mobile 相容。

設定您的專案

若要使用 On-Demand Services API 存取系列和產品詳細資訊,請遵循以下步驟。

  1. 下載 On-Demand Services API 文件,並使用 On-Demand Services API .zip 檔案中的申請表格來申請 API 金鑰。

  2. 下載 On-Demand Services SDK。此 SDK 將擁有參照實作,以便根據 AEM Mobile 重建 DPS 問題清單。

  3. 在 AEM Mobile 中設定專案、發佈多個系列,並使用隨選入口網站 (https://aemmobile.adobe.com) 的「產品與訂閱」區段將多個系列設定為零售 (關閉「免費產品」)。如需詳細資訊,請參閱「AEM Mobile 應用程式的應用程式內購買項目和訂閱」。

  4. 建立新的 Adobe ID。範例:de_user@company.com

  5. 將 Adobe ID「de_user@company.com」新增至將擷取資料的專案中。針對該用戶,只授與「檢視文章和系列資訊」與「檢視產品資訊」的權限。如需詳細資訊,請參閱「AEM Mobile 的帳戶管理」。

  6. 使用 Auth Exchange Tool 產生 device_id 和 device_token。請確定此程序中使用的 Adobe ID 與之前在 API 金鑰申請表格中指定的 ID 相同 (最多 3 個)。

    AEX Token 產生器只接受 Adobe ID,不接受 Enterprise ID 或 Federated ID。因此,您只能搭配 SDK 使用 Adobe ID。

  7. 修改「aemmobilesdk/configuration/credentials.php」並更新變數,以反映您的設定。

  8. 為您的專案取得專案 ID。您可以透過兩個方式來取得。

    方法 1:從入口網站複製專案 ID

    導覽至隨選入口網站的「內容與版面」區段。從導覽列的下拉式清單中選取專案。選取瀏覽器中的 URL。

    專案 ID 會列在「/publication/」文字後面。在此範例 URL 中,專案 ID 以粗體顯示:

    https://aemmobile.adobe.com/content/index.html#/publication/bf8a2101-abe5-4a4b-a02e-f7d4f5502d3c/content

    方法 2:使用 On-Demand Services API

    執行配方:recipe/authentication/getUserPermissions.php

    JSON 回應資料中的以下路徑可能包含多個專案 ID:$data['masters'][#]['publications'][#]['id'];

    例如,$data['masters'][0]['publications'][2]['id'] 中可找到範例專案 ID bf8a2101-abe5-4a4b-a02e-f7d4f5502d3c

建立配方

若要產生問題清單,您將需要產品 ID 和系列的清單。以下是為了使用 AEM Mobile SDK 產生問題清單所提供的配方:

  • 在 XML 摘要中:「recipes/product/genIssueList.php」
  • 在 JSON 中:「recipes/product/genIssueListJson.php」

設定

在此步驟中,您將會設定專案 ID、申請存取 Token 並儲存它 (在 PHP 工作階段)。後者可加以變更,以便儲存在本機資料庫中。存取 Token 的有效期間為 48 小時。

$currentDir = dirname(__FILE__); 
$parentDir = dirname($currentDir); 
$grandParentDir = dirname($parentDir); 
// include the AEM Mobile On-Demand Services SDK
require_once($grandParentDir . '/aemmobilesdk/vendor/autoload.php');
use aemmobilesdk\contentService\Collection; 
use aemmobilesdk\productService\Product; 
use aemmobilesdk\userService\User;
// provide the publication GUID 
$strPublicationGuid = '';
// initialize the user object 
$objPublishUser = new User(); 
// set the publication GUID $objPublishUser->setPublicationGuid($strPublicationGuid); 
// request and store the access token
$objPublishUser->requestToken()->storeToken();

資料庫版本:您可以使用「getToken()」直接取得存取 Token 並將它儲存在資料庫,而不用在上述範例的結尾呼叫「storeToken()」。如果您使用此方法,請使用適當的功能來更新 aemmobile\userService\Authorization::getStoredToken(),以便從資料庫提取存取 Token。

最佳做法:永遠都要儲存存取 Token (預設值是透過 PHP 工作階段) 並重複使用它,直到過期為止。一旦過期,此 SDK 將會自動回收 aemmobilesdk\authenticationService\ Authentication::requestToken()。

產品 ID 的清單

在此步驟中,我們將會申請產品 ID 的清單並儲存它 (在 PHP 工作階段)。後者可加以變更,以便儲存在本機資料庫中。

最佳做法:讓這個步驟成為獨立指令碼;建立將呼叫此獨立指令碼的 cron 工作,以便在合理的時間範圍內取得並儲存產品 ID 的清單。這將取決於您更新產品 ID 的頻率 (例如,每隔 15 分鐘)。如需獨立指令碼範例,請參閱「recipes/product/storeProductList.php」。

// initialize product object 
$objPublishProduct = new Product($objPublishUser); 
// request and store the list of product IDs WRT the account
$objPublishProduct->requestList()->storeList();

系列清單

在此步驟中,我們將會申請系列清單,並將它儲存在「$arrResponseMessage」變數中。

// initialize collection object 
$objPublishCollection = new Collection($objPublishUser); 
// get list of collections WRT the account 
$arrResponseMessage =
$objPublishCollection->requestList()->getResponse();

「$arrResponseMessage」將會包含系列實體名稱的陣列。您需要針對每個系列實體名稱提出一個要求來取得其中繼資料,後面緊接著取得其發佈狀態的另一個要求。

// iterate the list of collection entity names 
foreach ($arrResponseMessage as $collection) {
  // set the collection entity name
  $objPublishCollection->setIdFromHref($collection['href']);
  // get the collection metadata
  $arrCollectionData =
  $objPublishCollection->requestMetadata()->getResponse();
  // get the collection publishing status
  $bolPublishStatus =
  $objPublishCollection->requestStatus()->getPublishStatus();
}

此時,您可以重複系列中繼資料,並提取所有中繼資料或是只提取需要的中繼資料。將資料儲存為 XML 或 JSON 格式,最好使用後者,因為它比較快速。

foreach ($arrCollectionData as $strAttribute => $arrValue) {
   switch ($strAttribute) {
     case 'entityName':
       // store the entityName
       break;
     case 'department':
       // store the departments
       break;
     ... // add as many case as necessary
     default:
       // either store value as is or not at all
       break;
  }
}

下載影像

在上一個步驟中,當重複系列中繼資料時,只有在系列實體具有背景和/或縮圖影像,而且尚未下載到指令碼的本機時,指令碼才會下載影像。此條件的後半部是為了讓載入時間變得更快。

最佳做法:類似於處理產品 ID 的方式,影像下載應該是獨立指令碼,並包含 cron 工作,以便在合理的時間範圍內下載最新影像。如需獨立指令碼範例,請參閱「recipes/product/downloadImages.php」。

foreach ($arrCollectionData as $strAttribute => $arrValue) {
  switch ($strAttribute) {
    case '_links': // collection links
      foreach ($arrValue as $strInnerAttr => $arrInnerValue) {
        switch ($strInnerAttr) {
          case 'thumbnail':
          case 'background':
            // the image link is located in:
            // $strInnerValue['href']
            // i.e. contents/images/background
            // you can request the image by replacing "contents" with
            // the collection entity content URL and making a HTTP GET request
            break;
        }
      }
      break;
  }
}

生產中的部署

若要存取多個專案,您可以指派您在上面步驟中建立的相同 Adobe ID (de_user@company.com) 給其他任何專案。

如果您要針對多個客戶執行代管權益伺服器,您可以依照相同的配方進行。您將要求客戶將 Adobe ID (de_user@company.com) 新增至其專案中,好讓您的代管權益伺服器可以存取客戶的資料。

如果從專案中移除了 Adobe ID 或是撤銷了「檢視文章和系列」與「檢視產品資訊」的權限,就無法再存取該資訊。

變更記錄

2016/01/06

  • 「建立配方」新增了「下載影像」一節。

此産品由 Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License 授權  Creative Commons 條款未涵蓋 Twitter™ 與 Facebook 文章。

法律說明   |   線上隱私權政策