Åtkomsttoken för lokal utveckling
Utvecklare som bygger integreringar som kräver programmatisk åtkomst till AEM as a Cloud Service behöver ett enkelt och snabbt sätt att få temporära åtkomsttoken för AEM för att underlätta lokala utvecklingsaktiviteter. För att tillgodose detta behov AEM Developer Console tillåter utvecklare att själva generera temporära åtkomsttoken som kan användas för programmässig åtkomst till AEM.
Generera en lokal åtkomsttoken för utveckling
Token för lokal utvecklingsåtkomst ger åtkomst till AEM författare och Publish-tjänster som den användare som skapade token, tillsammans med deras behörigheter. Trots att detta är en utvecklingstoken bör du inte dela denna token eller lagra den i källkontrollen.
-
I Adobe Admin Console kontrollerar du att du, utvecklaren, är medlem i:
- Cloud Manager - utvecklare IMS-produktprofil (beviljar åtkomst till AEM Developer Console)
- Åtkomsttoken integreras antingen med AEM-administratörerna eller AEM användare IMS-produktprofilen för AEM tjänst.
- För sandlådemiljön i AEM as a Cloud Service krävs endast medlemskap i produktprofilen AEM administratörer eller AEM användare
-
Logga in på Adobe Cloud Manager
-
Öppna programmet som innehåller AEM as a Cloud Service-miljön som du kan integrera med
-
Tryck på ellipsen bredvid miljön i avsnittet Miljö och välj Developer Console
-
Tryck på fliken Integrationer
-
Tryck på fliken Lokal token
-
Tryck på knappen Hämta lokal utvecklingstoken
-
Tryck på hämtningsknappen i det övre vänstra hörnet för att hämta JSON-filen som innehåller värdet
accessToken
och spara JSON-filen på en säker plats på utvecklingsdatorn.- Detta är din dygnet-runt-token för utvecklaråtkomst till AEM as a Cloud Service-miljön.
Använde token för lokal utvecklingsåtkomst use-local-development-access-token
- Ladda ned den temporära Local Development Access Token från AEM Developer Console
- Den lokala utvecklingsåtkomsttoken upphör att gälla var 24:e timme, så utvecklare måste hämta nya åtkomsttoken varje dag
- Ett externt program utvecklas som programmässigt interagerar med AEM as a Cloud Service
- Det externa programmet läser i åtkomsttoken för lokal utveckling
- Det externa programmet konstruerar HTTP-begäranden till AEM as a Cloud Service och lägger till Local Development Access Token som en Bearer-token i HTTP-begärandenas auktoriseringshuvud
- AEM as a Cloud Service tar emot HTTP-begäran, autentiserar begäran och utför det arbete som begärdes av HTTP-begäran och returnerar ett HTTP-svar till det externa programmet
Externt exempelprogram
Vi ska skapa ett enkelt externt JavaScript-program som visar hur man programmässigt får åtkomst till AEM as a Cloud Service via HTTPS med hjälp av den lokala utvecklaråtkomsttoken. Detta visar hur alla-program eller system som körs utanför AEM, oavsett ramverk eller språk, kan använda åtkomsttoken för att autentisera till och få åtkomst till AEM as a Cloud Service via programkod. I nästa avsnitt uppdaterar vi den här programkoden så att den stöder metoden för att generera en token för användning i produktionen.
Det här exempelprogrammet körs från kommandoraden och uppdaterar metadata AEM resurser med hjälp av AEM Assets HTTP API:er, med följande flöde:
- Läser in parametrar från kommandoraden (
getCommandLineParams()
) - Hämtar den åtkomsttoken som används för autentisering till AEM as a Cloud Service (
getAccessToken(...)
) - Visar alla resurser i en AEM resursmapp som anges i kommandoradsparametrar (
listAssetsByFolder(...)
) - Uppdatera metadata för resurser i listan med värden som anges i kommandoradsparametrar (
updateMetadata(...)
)
Nyckelelementet för programmatisk autentisering till AEM med åtkomsttoken är att lägga till en HTTP-begäranderubrik för auktorisering till alla HTTP-begäranden som görs till AEM, i följande format:
Authorization: Bearer ACCESS_TOKEN
Kör det externa programmet
-
Kontrollera att Node.js är installerat på din lokala utvecklingsdator, som används för att köra det externa programmet
-
Hämta och zippa upp det externa exempelprogrammet
-
Kör
npm install
från kommandoraden i projektmappen -
Kopiera hämtningen av den lokala utvecklingsåtkomsttoken till en fil med namnet
local_development_token.json
i projektets rot- Men kom ihåg att aldrig binda några referenser till Git!
-
Öppna
index.js
och granska den externa programkoden och kommentarerna.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=en#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=en#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; } }
Granska
fetch(..)
-anropen ilistAssetsByFolder(...)
ochupdateMetadata(...)
och lägg märke till attheaders
definierar HTTP-begärandehuvudetAuthorization
med värdetBearer ACCESS_TOKEN
. Så här autentiserar HTTP-begäran från det externa programmet AEM as a Cloud Service.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 }, })...
Alla HTTP-begäranden till AEM as a Cloud Service måste ange Bearer-åtkomsttoken i auktoriseringsrubriken. Kom ihåg att varje AEM as a Cloud Service-miljö kräver en egen åtkomsttoken. Utvecklingens åtkomsttoken fungerar inte på scenen eller i produktionen, scenen fungerar inte på utveckling eller produktion och produktionens fungerar inte på utvecklingsfasen eller scenen!
-
Med kommandoraden från projektets rot kör du programmet och skickar följande parametrar:
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
Följande parametrar skickas:
aem
: Schemat och värdnamnet för den AEM as a Cloud Service-miljö som programmet interagerar med (t.ex.https://author-p1234-e5678.adobeaemcloud.com
).folder
: Sökvägen till resursmappen vars resurser uppdateras medpropertyValue
. Lägg INTE till prefixet/content/dam
(t.ex./wknd-shared/en/adventures/napa-wine-tasting
)propertyName
: Resursegenskapens namn som ska uppdateras i förhållande till[dam:Asset]/jcr:content
(t.ex.metadata/dc:rights
).propertyValue
: Värdet sompropertyName
ska anges till; värden med mellanslag måste kapslas in med"
(t.ex."WKND Limited Use"
)file
: Den relativa sökvägen till JSON-filen som hämtats från AEM Developer Console.
En lyckad körning av programresultatet för varje resurs som har uppdaterats:
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
Verifiera metadatauppdatering i AEM
Kontrollera att metadata har uppdaterats genom att logga in i AEM as a Cloud Service-miljön (kontrollera att samma värd som skickas till kommandoradsparametern aem
är tillgänglig).
- Logga in i AEM as a Cloud Service-miljön som det externa programmet interagerade med (använd samma värd som anges i kommandoradsparametern
aem
) - Navigera till Assets > Filer
- Navigera till resursmappen som anges av kommandoradsparametern
folder
, till exempel WKND > Engelska > Anteckningar > Napa-vindstick - Öppna Egenskaper för alla (icke-innehållsfragment) resurser i mappen
- Tryck på fliken Avancerat
- Granska värdet för den uppdaterade egenskapen, till exempel Copyright som är mappad till den uppdaterade JCR-egenskapen
metadata/dc:rights
som återspeglar värdet som anges i parameternpropertyValue
, till exempel WKND Limited Use
Nästa steg
Nu när vi programmässigt har kommit åt AEM as a Cloud Service via den lokala utvecklingstoken. Därefter måste vi uppdatera programmet så att det kan hanteras med tjänstens autentiseringsuppgifter, så att det här programmet kan användas i ett produktionssammanhang.