使用 On-Demand Services API 访问 AEM Mobile 的集合和产品详细信息

要求

必备知识

必要的产品

  • Adobe AEM Mobile
  • 访问 On-Demand Services API

简介

本文将介绍如何使用 AEM Mobile On-Demand Services API 检索产品和集合信息。此信息可用于为直接授权服务器提供数据以控制内容授权。AEM Mobile 使用相同的 Direct Entitlement API 作为 Digital Publishing Suite。这意味着,每个基于 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 issueList。

  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 密钥请求表中指定的 Adobe ID(最多 3 个)。

    AEX 令牌生成器仅接受 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'];

    例如,示例项目 ID bf8a2101-abe5-4a4b-a02e-f7d4f5502d3c 位于 $data['masters'][0]['publications'][2]['id'] 中

创建菜谱

要生成问题列表,您需要产品 ID 和集合的列表。提供了几个方法,可供您使用 AEM Mobile SDK 生成问题列表:

  • 在 XML 源中:recipes/product/genIssueList.php
  • 在 JSON 中:recipes/product/genIssueListJson.php

设置

在此步骤中,您将设置项目 ID,请求访问令牌,并存储它(在 PHP 会话中)。后者可以更改为存储在本地数据库中。访问令牌在 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();

数据库版本:不是在上述示例结尾调用“storeToken()”,您可以使用“getToken()”直接获取访问令牌并将其存储在数据库中。如果使用此方法,则会利用相应的功能更新 aemmobile\userService\Authorization::getStoredToken(),以便从数据库中提取访问令牌。

最佳实践:始终存储访问令牌(默认设置是通过 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 许可  Twitter™ 与 Facebook 中的内容不在 Creative Commons 的条款约束之下。

法律声明   |   在线隐私策略