Generare un token di accesso server-to-server nell’azione di App Builder
Le azioni App Builder potrebbero dover interagire con le API Adobe che supportano credenziali server-to-server OAuth e sono associate a progetti Adobe Developer Console in cui è distribuita l'app App Builder.
Questa guida spiega come generare un token di accesso utilizzando credenziali server-to-server OAuth per l'utilizzo in un'azione App Builder.
Configurazioni dei progetti Adobe Developer Console
Durante l'aggiunta dell'API Adobe desiderata al progetto Adobe Developer Console, nel passaggio Configura API selezionare il tipo di autenticazione OAuth Server-to-Server.
Per assegnare l’account del servizio di integrazione creato automaticamente di cui sopra, seleziona il profilo di prodotto desiderato. Pertanto, tramite il profilo di prodotto, vengono controllate le autorizzazioni dell’account di servizio.
file .env
Nel file .env
del progetto App Builder, aggiungi le chiavi personalizzate per le credenziali server-to-server OAuth del progetto Adobe Developer Console. I valori delle credenziali da server a server OAuth possono essere ottenuti dalle credenziali > OAuth Server-to-Server del progetto Adobe Developer Console per una determinata area di lavoro.
...
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
I valori per OAUTHS2S_CLIENT_ID
, OAUTHS2S_CLIENT_SECRET
, OAUTHS2S_CECREDENTIALS_METASCOPES
possono essere copiati direttamente dalla schermata Credenziali server-to-server OAuth del progetto Adobe Developer Console.
Mappatura degli input
Con il valore delle credenziali da server a server OAuth impostato nel file .env
, è necessario mapparle agli input dell'azione AppBuilder in modo che possano essere lette nell'azione stessa. A tale scopo, aggiungere voci per ogni variabile nell'azione inputs
di ext.config.yaml
nel formato: PARAMS_INPUT_NAME: $ENV_KEY
.
Ad esempio:
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
Le chiavi definite in inputs
sono disponibili nell'oggetto params
fornito per l'azione App Builder.
Credenziali server-to-server OAuth per accedere al token
Nell'azione App Builder, le credenziali server-to-server OAuth sono disponibili nell'oggetto params
. Utilizzando queste credenziali il token di accesso può essere generato utilizzando Librerie OAuth 2.0. Oppure puoi utilizzare la libreria Node Fetch per effettuare una richiesta POST all'endpoint del token Adobe IMS per ottenere il token di accesso.
Nell'esempio seguente viene illustrato come utilizzare la libreria node-fetch
per effettuare una richiesta POST all'endpoint token Adobe IMS per ottenere il token di accesso.
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;