在App Builder操作中生成服务器到服务器访问令牌
App Builder操作可能需要与支持 OAuth服务器到服务器凭据 且与App Builder应用程序部署的Adobe Developer Console项目关联的AdobeAPI进行交互。
本指南介绍如何使用 OAuth服务器到服务器凭据 生成访问令牌,以便在App Builder操作中使用。
Adobe Developer Console项目配置
将所需的AdobeAPI添加到Adobe Developer Console项目时,在 配置API 步骤中,选择 OAuth服务器到服务器 身份验证类型。
要分配上述自动创建的集成服务帐户,请选择所需的产品配置文件。 因此,通过产品用户档案,服务帐户权限被控制。
.env文件
在App Builder项目的.env
文件中,附加Adobe Developer Console项目的OAuth服务器到服务器凭据的自定义密钥。 可以从给定工作区的Adobe Developer Console项目的 凭据 > OAuth服务器到服务器 获取OAuth服务器到服务器凭据值。
...
OAUTHS2S_CLIENT_ID=58b23182d80a40fea8b12bc236d71167
OAUTHS2S_CLIENT_SECRET=p8e-EIRF6kY6EHLBSdw2b-pLUWKodDqJqSz3
OAUTHS2S_CECREDENTIALS_METASCOPES=AdobeID,openid,ab.manage,additional_info.projectedProductContext,read_organizations,read_profile,account_cluster.read
可以从Adobe Developer Console项目的OAuth服务器到服务器凭据屏幕直接复制OAUTHS2S_CLIENT_ID
、OAUTHS2S_CLIENT_SECRET
、OAUTHS2S_CECREDENTIALS_METASCOPES
的值。
输入映射
在.env
文件中设置OAuth服务器到服务器凭据值后,必须将它们映射到AppBuilder操作输入,以便在操作本身中读取它们。 为此,请在ext.config.yaml
操作inputs
中为每个变量添加条目,格式为: PARAMS_INPUT_NAME: $ENV_KEY
。
例如:
operations:
view:
- type: web
impl: index.html
actions: actions
runtimeManifest:
packages:
dx-excshell-1:
license: Apache-2.0
actions:
generic:
function: actions/generic/index.js
web: 'yes'
runtime: nodejs:16
inputs:
LOG_LEVEL: debug
OAUTHS2S_CLIENT_ID: $OAUTHS2S_CLIENT_ID
OAUTHS2S_CLIENT_SECRET: $OAUTHS2S_CLIENT_SECRET
OAUTHS2S_CECREDENTIALS_METASCOPES: $OAUTHS2S_CECREDENTIALS_METASCOPES
annotations:
require-adobe-auth: false
final: true
在inputs
下定义的键在提供给App Builder操作的params
对象上可用。
用于访问令牌的OAuth服务器到服务器凭据
在App Builder操作中,params
对象中提供了OAuth服务器到服务器凭据。 使用这些凭据可以使用OAuth 2.0库生成访问令牌。 或者,您可以使用Node获取库向Adobe IMS令牌端点发出POST请求以获取访问令牌。
以下示例演示了如何使用node-fetch
库向Adobe IMS令牌端点发出POST请求以获取访问令牌。
const fetch = require("node-fetch");
const { Core } = require("@adobe/aio-sdk");
const { errorResponse, stringParameters, checkMissingRequestInputs } = require("../utils");
async function main(params) {
const logger = Core.Logger("main", { level: params.LOG_LEVEL || "info" });
try {
// Perform any necessary input error checking
const systemErrorMessage = checkMissingRequestInputs(params, ["OAUTHS2S_CLIENT_ID", "OAUTHS2S_CLIENT_SECRET", "OAUTHS2S_CECREDENTIALS_METASCOPES"], []);
// The Adobe IMS token endpoint URL
const adobeIMSV3TokenEndpointURL = 'https://ims-na1.adobelogin.com/ims/token/v3';
// The POST request options
const options = {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
body: `grant_type=client_credentials&client_id=${params.OAUTHS2S_CLIENT_ID}&client_secret=${params.OAUTHS2S_CLIENT_SECRET}&scope=${params.OAUTHS2S_CECREDENTIALS_METASCOPES}`,
};
// Make a POST request to the Adobe IMS token endpoint to get the access token
const tokenResponse = await fetch(adobeIMSV3TokenEndpointURL, options);
const tokenResponseJSON = await tokenResponse.json();
// The 24-hour IMS Access Token is used to call the AEM Data Service API
// Can look at caching this token for 24 hours to reduce calls
const accessToken = tokenResponseJSON.access_token;
// Invoke an AEM Data Service API using the access token
const aemDataResponse = await fetch(`https://api.adobeaemcloud.com/adobe/stats/statistics/contentRequestsQuota?imsOrgId=${IMS_ORG_ID}¤t=true`, {
headers: {
'X-Adobe-Accept-Experimental': '1',
'x-gw-ims-org-id': IMS_ORG_ID,
'X-Api-Key': params.OAUTHS2S_CLIENT_ID,
Authorization: `Bearer ${access_token}`, // The 24-hour IMS Access Token
},
method: "GET",
});
if (!aemDataResponse.ok) { throw new Error("Request to API failed with status code " + aemDataResponse.status);}
// API data
let data = await aemDataResponse.json();
const response = {
statusCode: 200,
body: data,
};
return response;
} catch (error) {
logger.error(error);
return errorResponse(500, "server error", logger);
}
}
exports.main = main;