Gli sviluppatori che creano integrazioni che richiedono un accesso programmatico a AEM as a Cloud Service hanno bisogno di un modo semplice e rapido per ottenere token di accesso temporanei per AEM per facilitare le attività di sviluppo locale. Per soddisfare questa esigenza, la console per sviluppatori AEM consente agli sviluppatori di generare autonomamente token di accesso temporanei che possono essere utilizzati per accedere all’AEM a livello di programmazione.
Il token di accesso per lo sviluppo locale consente di accedere ai servizi Author e Publish di AEM come utente che ha generato il token, insieme alle relative autorizzazioni. Anche se si tratta di un token di sviluppo, non condividere questo token o archiviarlo nel controllo del codice sorgente.
accessToken
e salva il file JSON in una posizione sicura sul computer di sviluppo.
Verrà creata una semplice applicazione JavaScript esterna per illustrare come accedere a livello di programmazione a AEM as a Cloud Service tramite HTTPS utilizzando il token di accesso per sviluppatori locale. Questo illustra come qualsiasi l'applicazione o il sistema eseguito al di fuori dell'AEM, indipendentemente dal framework o dalla lingua, può utilizzare il token di accesso per l'autenticazione a livello di programmazione e l'accesso a AEM as a Cloud Service. In sezione successiva, questo codice dell’applicazione verrà aggiornato per supportare l’approccio alla generazione di un token per l’utilizzo in produzione.
Questa applicazione di esempio viene eseguita dalla riga di comando e aggiorna i metadati delle risorse AEM tramite le API HTTP di AEM Assets, utilizzando il seguente flusso:
getCommandLineParams()
)getAccessToken(...)
)listAssetsByFolder(...)
)updateMetadata(...)
)L’elemento chiave per l’autenticazione a livello di programmazione in AEM tramite il token di accesso è l’aggiunta di un’intestazione di richiesta HTTP di autorizzazione a tutte le richieste HTTP effettuate all’AEM, nel formato seguente:
Authorization: Bearer ACCESS_TOKEN
Assicurati che Node.js è installato nel computer di sviluppo locale, utilizzato per eseguire l'applicazione esterna
Scarica e decomprimi il file applicazione esterna di esempio
Dalla riga di comando, nella cartella del progetto, eseguire npm install
Copia il ha scaricato il token di accesso per lo sviluppo locale in un file denominato local_development_token.json
nella directory principale del progetto
Apri index.js
e controlla il codice e i commenti dell’applicazione esterna.
const fetch = require('node-fetch');
const fs = require('fs');
const auth = require('@adobe/jwt-auth');
// The root context of the Assets HTTP API
const ASSETS_HTTP_API = '/api/assets';
// Command line parameters
let params = { };
/**
* Application entry point function
*/
(async () => {
console.log('Example usage: node index.js aem=https://author-p1234-e5678.adobeaemcloud.com propertyName=metadata/dc:rights "propertyValue=WKND Limited Use" folder=/wknd-shared/en/adventures/napa-wine-tasting file=credentials-file.json' );
// Parse the command line parameters
params = getCommandLineParams();
// Set the access token to be used in the HTTP requests to be local development access token
params.accessToken = await getAccessToken(params.developerConsoleCredentials);
// Get a list of all the assets in the specified assets folder
let assets = await listAssetsByFolder(params.folder);
// For each asset, update it's metadata
await assets.forEach(asset => updateMetadata(asset, {
[params.propertyName]: params.propertyValue
}));
})();
/**
* Returns a list of Assets HTTP API asset URLs that reference the assets in the specified folder.
*
* https://experienceleague.adobe.com/docs/experience-manager-cloud-service/assets/admin/mac-api-assets.html?lang=it#retrieve-a-folder-listing
*
* @param {*} folder the Assets HTTP API folder path (less the /content/dam path prefix)
*/
async function listAssetsByFolder(folder) {
return fetch(`${params.aem}${ASSETS_HTTP_API}${folder}.json`, {
method: 'get',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + params.accessToken // Provide the AEM access token in the Authorization header
},
})
.then(res => {
console.log(`${res.status} - ${res.statusText} @ ${params.aem}${ASSETS_HTTP_API}${folder}.json`);
// If success, return the JSON listing assets, otherwise return empty results
return res.status === 200 ? res.json() : { entities: [] };
})
.then(json => {
// Returns a list of all URIs for each non-content fragment asset in the folder
return json.entities
.filter((entity) => entity['class'].indexOf('asset/asset') === -1 && !entity.properties.contentFragment)
.map(asset => asset.links.find(link => link.rel.find(r => r === 'self')).href);
});
}
/**
* Update the metadata of an asset in AEM
*
* https://experienceleague.adobe.com/docs/experience-manager-cloud-service/assets/admin/mac-api-assets.html?lang=it#update-asset-metadata
*
* @param {*} asset the Assets HTTP API asset URL to update
* @param {*} metadata the metadata to update the asset with
*/
async function updateMetadata(asset, metadata) {
await fetch(`${asset}`, {
method: 'put',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + params.accessToken // Provide the AEM access token in the Authorization header
},
body: JSON.stringify({
class: 'asset',
properties: metadata
})
})
.then(res => {
console.log(`${res.status} - ${res.statusText} @ ${asset}`);
});
}
/**
* Parse and return the command line parameters. Expected params are:
*
* - aem = The AEM as a Cloud Service hostname to connect to.
* Example: https://author-p12345-e67890.adobeaemcloud.com
* - folder = The asset folder to update assets in. Note that the Assets HTTP API do NOT use the JCR `/content/dam` path prefix.
* Example: '/wknd-shared/en/adventures/napa-wine-tasting'
* - propertyName = The asset property name to update. Note this is relative to the [dam:Asset]/jcr:content node of the asset.
* Example: metadata/dc:rights
* - propertyValue = The value to update the asset property (specified by propertyName) with.
* Example: "WKND Free Use"
* - file = The path to the JSON file that contains the credentials downloaded from AEM Developer Console
* Example: local_development_token_cm_p1234-e5678.json
*/
function getCommandLineParams() {
let parameters = {};
// Parse the command line params, splitting on the = delimiter
for (let i = 2; i < process.argv.length; i++) {
let key = process.argv[i].split('=')[0];
let value = process.argv[i].split('=')[1];
parameters[key] = value;
};
// Read in the credentials from the provided JSON file
if (parameters.file) {
parameters.developerConsoleCredentials = JSON.parse(fs.readFileSync(parameters.file));
}
console.log(parameters);
return parameters;
}
async function getAccessToken(developerConsoleCredentials) {s
if (developerConsoleCredentials.accessToken) {
// This is a Local Development access token
return developerConsoleCredentials.accessToken;
}
}
Rivedi fetch(..)
chiamate in listAssetsByFolder(...)
e updateMetadata(...)
, e avviso headers
definire Authorization
Intestazione di richiesta HTTP con valore Bearer ACCESS_TOKEN
. In questo modo la richiesta HTTP proveniente dall’applicazione esterna si autentica in AEM as a Cloud Service.
...
return fetch(`${params.aem}${ASSETS_HTTP_API}${folder}.json`, {
method: 'get',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + params.accessToken // Provide the AEM access token in the Authorization header
},
})...
Eventuali richieste HTTP a AEM as a Cloud Service devono impostare il token di accesso Bearer nell’intestazione Autorizzazione. Ricorda che ogni ambiente AEM as a Cloud Service richiede il proprio token di accesso. Il token di accesso per lo sviluppo non funziona sullo stage o sulla produzione, quello dello stage non funziona sullo sviluppo o sulla produzione e quello della produzione non funziona sullo sviluppo o sullo stage!
Utilizzando la riga di comando, dalla directory principale del progetto esegui l’applicazione, trasmettendo i seguenti parametri:
$ node index.js \
aem=https://author-p1234-e5678.adobeaemcloud.com \
folder=/wknd-shared/en/adventures/napa-wine-tasting \
propertyName=metadata/dc:rights \
propertyValue="WKND Limited Use" \
file=local_development_token.json
Vengono trasmessi i seguenti parametri:
aem
: schema e nome host dell’ambiente as a Cloud Service AEM con cui l’applicazione interagisce (ad esempio https://author-p1234-e5678.adobeaemcloud.com
).folder
: percorso della cartella di risorse le cui risorse vengono aggiornate con propertyValue
; NON aggiungere il /content/dam
prefisso (es. /wknd-shared/en/adventures/napa-wine-tasting
)propertyName
: nome della proprietà della risorsa da aggiornare, relativo a [dam:Asset]/jcr:content
(es. metadata/dc:rights
).propertyValue
: valore per impostare propertyName
a; i valori con spazi devono essere racchiusi con "
(es. "WKND Limited Use"
)file
: percorso relativo del file JSON scaricato da AEM Developer Console.Esecuzione corretta dell’output dei risultati dell’applicazione per ogni risorsa aggiornata:
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_239751461.jpg.json
200 - OK @ https://author-p1234-e5678.adobeaemcloud.com/api/assets/wknd-shared/en/adventures/napa-wine-tasting/AdobeStock_280313729.jpg.json
200 - OK @ https://author-p1234-e5678.adobeaemcloud.com/api/assets/wknd-shared/en/adventures/napa-wine-tasting/AdobeStock_286664352.jpg.json
Verifica che i metadati siano stati aggiornati accedendo all’ambiente as a Cloud Service dell’AEM (assicurati che lo stesso host sia stato trasmesso al aem
parametro della riga di comando).
aem
(parametro della riga di comando)folder
parametro della riga di comando, ad esempio WKND > Inglese > Avventure > Degustazione del vino Napametadata/dc:rights
proprietà JCR, che riflette il valore fornito nella propertyValue
parametro, ad esempio Utilizzo limitato WKNDOra che abbiamo effettuato l’accesso a livello di programmazione a AEM as a Cloud Service utilizzando il token di sviluppo locale. Ora è necessario aggiornare l’applicazione in modo che possa essere gestita utilizzando le credenziali del servizio, in modo che possa essere utilizzata in un contesto di produzione.