与Adobe Experience Manager(AEM)as a Cloud Service的集成必须能够安全地验证AEM服务。 AEM开发人员控制台授予对服务凭据的访问权限,服务凭据用于促进外部应用程序、系统和服务以编程方式通过HTTP与AEM创作或发布服务交互。
服务凭据可能显示类似 本地开发访问令牌 但在几个关键方面却有所不同:
应将服务凭据及其生成的访问令牌和本地开发访问令牌均保密。 由于所有这三种环境均可用于获取,因此可以访问各自的AEMas a Cloud Service环境。
服务凭据生成分为两个步骤:
与本地开发访问令牌不同,服务凭据要求Adobe组织IMS管理员先创建技术帐户,然后才能下载。 应为每个需要以编程方式访问AEM的客户端创建离散技术帐户。
技术帐户只创建一次,但随着时间的推移,可以管理用于管理与技术帐户关联的服务凭据的私钥。 例如,必须在当前私钥过期之前生成新的私钥/服务凭据,以便用户能够不间断地访问服务凭据。
初始化AEM作为Cloud Service环境的服务凭据后,您的Adobe IMS组织中的其他AEM开发人员可以下载这些凭据。
下载服务凭据的步骤与初始化步骤类似。
服务凭据提供生成JWT所需的详细信息,JWT用于交换用于通过AEMas a Cloud Service进行身份验证的访问令牌。 服务凭据必须存储在安全位置,外部应用程序、系统或服务可使用服务凭据访问AEM。 每个客户管理服务凭据的方式和位置都是唯一的。
为了简单起见,本教程将通过命令行传递服务凭据。 但是,请与您的IT安全团队合作,了解如何根据贵组织的安全准则存储和访问这些凭据。
service_token.json
在项目的根中
服务凭据(一个格式完整的JSON对象)与JWT或访问令牌不同。 服务凭据(包含私钥)而是用于生成JWT,JWT将与Adobe IMS API交换以获取访问令牌。
要使用服务凭据访问AEMas a Cloud Service,必须通过三种方式更新外部应用程序:
在本教程中,Adobe @adobe/jwt-auth
npm模块用于两者,(1)从服务凭据生成JWT,(2)在单个函数调用中将其交换为访问令牌。 如果您的应用程序不基于JavaScript,请查看 其他语言的示例代码 以了解如何从服务凭据创建JWT,并将其与Adobe IMS交换为访问令牌。
查看 getCommandLineParams()
因此,请参阅如何使用本地开发访问令牌JSON中用于读取的相同代码读取服务凭据JSON文件。
function getCommandLineParams() {
...
// Read in the credentials from the provided JSON file
// Since both the Local Development Access Token and Service Credentials files are JSON, this same approach can be re-used
if (parameters.file) {
parameters.developerConsoleCredentials = JSON.parse(fs.readFileSync(parameters.file));
}
...
return parameters;
}
读取服务凭据后,将使用它们生成JWT,然后与Adobe IMS API交换JWT以获取访问令牌。 然后,可以使用此访问令牌访问AEMas a Cloud Service。
此示例应用程序基于Node.js,因此最好使用 @adobe/jwt-auth npm模块,以便于(1)生成JWT并(20次与Adobe IMS交换) 如果您的应用程序是使用其他语言开发的,请查看 相应的代码示例 了解如何使用其他编程语言构建到Adobe IMS的HTTP请求。
更新 getAccessToken(..)
用于检查JSON文件内容并确定它是否表示本地开发访问令牌或服务凭据。 这可以通过检查 .accessToken
属性,该属性仅存在于本地开发访问令牌JSON中。
如果提供了服务凭据,则应用程序会生成JWT并与Adobe IMS交换JWT以获取访问令牌。 使用 @adobe/jwt-auth's auth(...)
函数,该函数生成JWT并在单个函数调用中为访问令牌交换JWT。 的参数 auth(..)
方法是 由特定信息组成的JSON对象 可从服务凭据JSON中获取,如代码中所述。
async function getAccessToken(developerConsoleCredentials) {
if (developerConsoleCredentials.accessToken) {
// This is a Local Development access token
return developerConsoleCredentials.accessToken;
} else {
// This is the Service Credentials JSON object that must be exchanged with Adobe IMS for an access token
let serviceCredentials = developerConsoleCredentials.integration;
// Use the @adobe/jwt-auth library to pass the service credentials generated a JWT and exchange that with Adobe IMS for an access token.
// If other programming languages are used, please see these code samples: https://www.adobe.io/authentication/auth-methods.html#!AdobeDocs/adobeio-auth/master/JWT/samples/samples.md
let { access_token } = await auth({
clientId: serviceCredentials.technicalAccount.clientId, // Client Id
technicalAccountId: serviceCredentials.id, // Technical Account Id
orgId: serviceCredentials.org, // Adobe IMS Org Id
clientSecret: serviceCredentials.technicalAccount.clientSecret, // Client Secret
privateKey: serviceCredentials.privateKey, // Private Key to sign the JWT
metaScopes: serviceCredentials.metascopes.split(','), // Meta Scopes defining level of access the access token should provide
ims: `https://${serviceCredentials.imsEndpoint}`, // IMS endpoint used to obtain the access token from
});
return access_token;
}
}
现在,根据通过“file”命令行参数传入的JSON文件(本地开发访问令牌JSON或服务凭据JSON),应用程序将派生访问令牌。
请记住,尽管服务凭据每365天过期一次,但JWT和相应的访问令牌会频繁过期,并且需要在它们过期之前进行刷新。 可以使用“refresh_token”[由Adobe IMS提供](https://www.adobe.io/authentication/auth-methods.html#!AdobeDocs/adobeio-auth/master/OAuth/OAuth.md#access-tokens)来完成此操作。
实施这些更改后,服务凭据JSON从AEM开发人员控制台中下载,并且为了简单起见,另存为 service_token.json
在与此相同的文件夹中 index.js
. 现在,让我们执行替换命令行参数的应用程序 file
with service_token.json
,并更新 propertyValue
值,以便在AEM中显示效果。
$ node index.js \
aem=https://author-p1234-e5678.adobeaemcloud.com \
folder=/wknd-shared/en/adventures/napa-wine-tasting \
propertyName=metadata/dc:rights \
propertyValue="WKND Restricted Use" \
file=service_token.json
到终端的输出如下所示:
200 - OK @ https://author-p1234-e5678.adobeaemcloud.com/api/assets/wknd-shared/en/adventures/napa-wine-tasting.json
403 - Forbidden @ https://author-p1234-e5678.adobeaemcloud.com/api/assets/wknd-shared/en/adventures/napa-wine-tasting/AdobeStock_277654931.jpg.json
403 - Forbidden @ https://author-p1234-e5678.adobeaemcloud.com/api/assets/wknd-shared/en/adventures/napa-wine-tasting/AdobeStock_239751461.jpg.json
403 - Forbidden @ https://author-p1234-e5678.adobeaemcloud.com/api/assets/wknd-shared/en/adventures/napa-wine-tasting/AdobeStock_280313729.jpg.json
403 - Forbidden @ https://author-p1234-e5678.adobeaemcloud.com/api/assets/wknd-shared/en/adventures/napa-wine-tasting/AdobeStock_286664352.jpg.json
的 403 — 禁止 行,指示对AEMas a Cloud Service的HTTP API调用中出错。 尝试更新资产的元数据时,会出现这些403禁止错误。
原因是服务凭据派生的访问令牌使用自动创建的技术帐户AEM用户对AEM的请求进行身份验证,默认情况下,该用户仅具有读取访问权限。 要提供对AEM的应用程序写入访问权限,必须向与访问令牌关联的技术帐户AEM用户授予在AEM中的权限。
服务凭据派生的访问令牌使用的技术帐户AEM用户在 参与者 AEM用户组。
在AEM中存在技术帐户AEM用户(在首次通过访问令牌发出HTTP请求后)后,可以像管理其他AEM用户一样管理此AEM用户的权限。
integration.email
值,它应类似于: 12345678-abcd-9000-efgh-0987654321c@techacct.adobe.com
.在AEM中允许具有资产写入权限的技术帐户下,重新运行应用程序:
$ node index.js \
aem=https://author-p1234-e5678.adobeaemcloud.com \
folder=/wknd-shared/en/adventures/napa-wine-tasting \
propertyName=metadata/dc:rights \
propertyValue="WKND Restricted Use" \
file=service_token.json
到终端的输出如下所示:
200 - OK @ https://author-p1234-e5678.adobeaemcloud.com/api/assets/wknd-shared/en/adventures/napa-wine-tasting.json
200 - OK @ https://author-p1234-e5678.adobeaemcloud.com/api/assets/wknd-shared/en/adventures/napa-wine-tasting/AdobeStock_277654931.jpg.json
200 - OK @ https://author-p1234-e5678.adobeaemcloud.com/api/assets/wknd-shared/en/adventures/napa-wine-tasting/AdobeStock_286664352.jpg.json
200 - OK @ https://author-p1234-e5678.adobeaemcloud.com/api/assets/wknd-shared/en/adventures/napa-wine-tasting/AdobeStock_239751461.jpg.json
200 - OK @ https://author-p1234-e5678.adobeaemcloud.com/api/assets/wknd-shared/en/adventures/napa-wine-tasting/AdobeStock_280313729.jpg.json
aem
命令行参数)folder
命令行参数,例如 WKND > 英语 > 冒险 > 纳帕品酒会metadata/dc:rights
JCR属性,该属性现在反映 propertyValue
参数,例如 WKND受限使用现在,我们已使用本地开发访问令牌和生产就绪的服务到服务访问令牌以编程方式访问AEMas a Cloud Service!