Token di accesso per lo sviluppo locale
Gli sviluppatori che creano integrazioni che richiedono l’accesso programmatico ad AEM as a Cloud Service hanno bisogno di un modo semplice e rapido per ottenere token di accesso temporanei per l’AEM al fine di facilitare le attività di sviluppo locale. Per soddisfare questa necessità, il Developer Console dell’AEM consente agli sviluppatori di generare autonomamente token di accesso temporanei che possono essere utilizzati per accedere all’AEM a livello di programmazione.
Generare un token di accesso per lo sviluppo locale
Il Token di accesso per lo sviluppo locale consente di accedere ai servizi Author dell’AEM e Publish 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.
-
In Adobe Admin Console assicurati che tu, lo sviluppatore, sia membro di:
- Cloud Manager - Profilo di prodotto IMS per sviluppatori (consente l'accesso a AEM Developer Console)
- Il token di accesso si integra con il profilo di prodotto IMS Amministratori AEM o Utenti AEM per il servizio dell'ambiente AEM
- L'ambiente Sandbox AEM as a Cloud Service richiede l'appartenenza solo al profilo di prodotto Amministratori AEM o Utenti AEM
-
Accedi a Adobe Cloud Manager
-
Apri il programma contenente l’ambiente AEM as a Cloud Service da integrare con
-
Tocca puntini di sospensione accanto all'ambiente nella sezione Ambienti e seleziona Developer Console
-
Tocca nella scheda Integrazioni
-
Tocca la scheda Token locale
-
Tocca Pulsante Ottieni token di sviluppo locale
-
Tocca il pulsante di download nell'angolo in alto a sinistra per scaricare il file JSON contenente il valore
accessToken
e salvare il file JSON in una posizione sicura sul computer di sviluppo.- Questo è il token di accesso per sviluppatori all’ambiente AEM as a Cloud Service, valido 24 ore.
Utilizzato il token di accesso per lo sviluppo locale use-local-development-access-token
- Scarica il token di accesso temporaneo per lo sviluppo locale da AEM Developer Console
- Il token di accesso per lo sviluppo locale scade ogni 24 ore, pertanto gli sviluppatori devono scaricare i nuovi token di accesso ogni giorno
- È in fase di sviluppo un’applicazione esterna che interagisce in modo programmatico con AEM as a Cloud Service
- L’applicazione esterna legge nel token di accesso per lo sviluppo locale
- L’applicazione esterna crea le richieste HTTP in AEM as a Cloud Service, aggiungendo il token di accesso per lo sviluppo locale come token Bearer all’intestazione Autorizzazione delle richieste HTTP
- AEM as a Cloud Service riceve la richiesta HTTP, la autentica ed esegue il lavoro richiesto dalla richiesta HTTP e restituisce una risposta HTTP all’applicazione esterna.
Applicazione esterna di esempio
Creeremo una semplice applicazione JavaScript esterna per illustrare come accedere a livello di programmazione ad AEM as a Cloud Service tramite HTTPS utilizzando il token di accesso per sviluppatori locale. In questo esempio viene illustrato come qualsiasi applicazione o sistema in esecuzione al di fuori di AEM, indipendentemente dal framework o dalla lingua, può utilizzare il token di accesso per l'autenticazione a livello di programmazione e per l'accesso a AEM as a Cloud Service. Nella sezione successiva, aggiorneremo questo codice dell'applicazione per supportare l'approccio per la 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:
- Legge i parametri dalla riga di comando (
getCommandLineParams()
) - Ottiene il token di accesso utilizzato per l'autenticazione in AEM as a Cloud Service (
getAccessToken(...)
) - Elenca tutte le risorse in una cartella di risorse AEM specificata nei parametri della riga di comando (
listAssetsByFolder(...)
) - Aggiorna i metadati delle risorse elencate con i valori specificati nei parametri della riga di comando (
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
Esecuzione dell'applicazione esterna
-
Assicurati che Node.js sia installato nel computer di sviluppo locale, utilizzato per eseguire l'applicazione esterna
-
Scarica e decomprimi l'applicazione esterna di esempio
-
Dalla riga di comando, nella cartella del progetto, eseguire
npm install
-
Copia il token di accesso per lo sviluppo locale scaricato in un file denominato
local_development_token.json
nella radice del progetto- Ma ricorda, non impegnare mai le credenziali per Git!
-
Apri
index.js
e controlla il codice e i commenti dell'applicazione esterna.code language-javascript 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; } }
Esaminare le chiamate
fetch(..)
inlistAssetsByFolder(...)
eupdateMetadata(...)
e notare cheheaders
definiscono l'intestazione della richiesta HTTPAuthorization
con un valore diBearer ACCESS_TOKEN
. La richiesta HTTP proveniente dall’applicazione esterna si autentica in AEM as a Cloud Service in questo modo.code language-javascript ... 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 ad 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:
code language-shell $ 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 AEM as a Cloud Service con cui l'applicazione interagisce (ad esempiohttps://author-p1234-e5678.adobeaemcloud.com
).folder
: il percorso della cartella di risorse le cui risorse sono aggiornate conpropertyValue
; NON aggiungere il prefisso/content/dam
(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 su cui impostarepropertyName
; i valori con spazi devono essere incapsulati 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:
code language-shell 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 dell’aggiornamento dei metadati in AEM
Verificare che i metadati siano stati aggiornati effettuando l'accesso all'ambiente AEM as a Cloud Service (verificare che sia possibile accedere allo stesso host passato al parametro della riga di comando aem
).
- Accedere all'ambiente AEM as a Cloud Service con cui l'applicazione esterna ha interagito (utilizzare lo stesso host fornito nel parametro della riga di comando
aem
) - Passa a Assets > File
- Spostati nella cartella delle risorse specificata dal parametro della riga di comando
folder
, ad esempio WKND > Inglese > Avventure > Degustazione del vino Napa - Apri Proprietà per qualsiasi risorsa (non frammento di contenuto) nella cartella
- Tocca la scheda Avanzate
- Rivedi il valore della proprietà aggiornata, ad esempio Copyright mappato alla proprietà JCR
metadata/dc:rights
aggiornata, che riflette il valore fornito nel parametropropertyValue
, ad esempio WKND Limited Use
Passaggi successivi
Ora che abbiamo effettuato l’accesso a livello di programmazione ad 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.