Las integraciones con AEM as a Cloud Service deben poder autenticarse de forma segura en AEM. AEM Developer Console otorga acceso a las credenciales de servicio, que se utilizan para facilitar la interacción mediante programación de aplicaciones, sistemas y servicios externos con AEM Author o Publish Services a través de HTTP.
Las credenciales del servicio pueden aparecer de forma similar Tokens de acceso de desarrollo local pero son diferentes de algunas maneras clave:
Tanto las credenciales de servicio como los tokens de acceso que generan, así como los tokens de acceso de desarrollo local, deben mantenerse en secreto, ya que los tres pueden utilizarse para obtener acceso a sus entornos as a Cloud Service AEM respectivos
La generación de credenciales de servicio se divide en dos pasos:
Las credenciales de servicio, a diferencia de los tokens de acceso de desarrollo local, requieren un inicialización única por su administrador de IMS de la organización de Adobe antes de que se puedan descargar.
Es una inicialización única por AEM entorno as a Cloud Service
Una vez inicializadas las credenciales de servicio del AEM como entorno de Cloud Service, otros desarrolladores de AEM de su organización IMS de Adobe pueden descargarlas.
La descarga de las credenciales de servicio sigue los mismos pasos que la inicialización. Si la inicialización aún no se ha producido, se mostrará al usuario un error al tocar el botón Obtener credenciales de servicio botón.
Las credenciales del servicio proporcionan los detalles necesarios para generar un JWT, que se intercambia por un token de acceso utilizado para autenticarse con AEM as a Cloud Service. Las Credenciales de Servicio deben almacenarse en una ubicación segura accesible a través de las aplicaciones, sistemas o servicios externos que la utilizan para acceder a AEM. Cómo y dónde se administran las credenciales de servicio serán únicas para cada cliente.
Para simplificar, este tutorial pasa las credenciales de servicio a través de la línea de comandos, sin embargo, trabaje con su equipo de seguridad de TI para comprender cómo almacenar y acceder a estas credenciales de acuerdo con las directrices de seguridad de su organización.
service_token.json
en la raíz del proyecto
Las credenciales de servicio, un objeto JSON completamente formado, no son lo mismo que el JWT ni el token de acceso. En su lugar, las credenciales de servicio (que contienen una clave privada) se utilizan para generar un JWT, que se intercambia con las API de Adobe IMS por un token de acceso.
Para acceder a AEM as a Cloud Service mediante las credenciales de servicio, nuestra aplicación externa debe actualizarse de 3 maneras:
En este tutorial, el Adobe @adobe/jwt-auth
El módulo npm se utiliza para ambos, (1) genera el JWT a partir de las credenciales del servicio y (2) lo cambia por un token de acceso, en una sola llamada a la función. Si la aplicación no está basada en JavaScript, revise la código de muestra en otros idiomas para obtener información sobre cómo crear un JWT a partir de las credenciales del servicio y cómo intercambiarlo por un token de acceso con Adobe IMS.
Consulte la getCommandLineParams()
y veamos que podemos leer en los archivos JSON de credenciales de servicio utilizando el mismo código utilizado para leer en el JSON de token de acceso de desarrollo local.
function getCommandLineParams() {
...
// Read in the credentials from the provided JSON file
// Since both the Local Development Access Token and Service Credentials files are JSON, this same approach can be re-used
if (parameters.file) {
parameters.developerConsoleCredentials = JSON.parse(fs.readFileSync(parameters.file));
}
...
return parameters;
}
Una vez leídas las credenciales de servicio, se utilizan para generar un JWT que luego se intercambia con las API de Adobe IMS por un token de acceso, que luego se puede utilizar para acceder a AEM as a Cloud Service.
Esta aplicación de ejemplo está basada en Node.js, por lo que es mejor utilizar @adobe/jwt-auth módulo npm para facilitar la (1) generación de JWT y (20 intercambio con Adobe IMS. Si su aplicación está desarrollada con otro idioma, consulte las muestras de código correspondientes sobre cómo construir la solicitud HTTP a Adobe IMS utilizando otros lenguajes de programación.
Actualice el getAccessToken(..)
para inspeccionar el contenido del archivo JSON y determinar si representa un token de acceso de desarrollo local o credenciales de servicio. Esto se puede lograr fácilmente comprobando la existencia de la variable .accessToken
, que solo existe para el token de acceso de desarrollo local JSON.
Si se proporcionan credenciales de servicio, la aplicación genera un JWT y lo intercambia con Adobe IMS para obtener un token de acceso. Usaremos el @adobe/jwt-auth's auth(...)
que genera un JWT y lo intercambia por un token de acceso en una sola llamada de función. Los parámetros para auth(..)
es Objeto JSON formado por información específica disponible desde el JSON de credenciales de servicio, como se describe a continuación en el código.
async function getAccessToken(developerConsoleCredentials) {
if (developerConsoleCredentials.accessToken) {
// This is a Local Development access token
return developerConsoleCredentials.accessToken;
} else {
// This is the Service Credentials JSON object that must be exchanged with Adobe IMS for an access token
let serviceCredentials = developerConsoleCredentials.integration;
// Use the @adobe/jwt-auth library to pass the service credentials generated a JWT and exchange that with Adobe IMS for an access token.
// If other programming languages are used, please see these code samples: https://www.adobe.io/authentication/auth-methods.html#!AdobeDocs/adobeio-auth/master/JWT/samples/samples.md
let { access_token } = await auth({
clientId: serviceCredentials.technicalAccount.clientId, // Client Id
technicalAccountId: serviceCredentials.id, // Technical Account Id
orgId: serviceCredentials.org, // Adobe IMS Org Id
clientSecret: serviceCredentials.technicalAccount.clientSecret, // Client Secret
privateKey: serviceCredentials.privateKey, // Private Key to sign the JWT
metaScopes: serviceCredentials.metascopes.split(','), // Meta Scopes defining level of access the access token should provide
ims: `https://${serviceCredentials.imsEndpoint}`, // IMS endpoint used to obtain the access token from
});
return access_token;
}
}
Ahora, según qué archivo JSON (el JSON del token de acceso de desarrollo local o el JSON de credenciales de servicio) se transfiera mediante . file
parámetro de línea de comandos, la aplicación derivará un token de acceso.
Recuerde que mientras que las credenciales de servicio caducan cada 365 días, el JWT y el token de acceso correspondiente caducan con frecuencia y deben actualizarse antes de que caduquen. Esto se puede hacer utilizando una refresh_token
proporcionado por Adobe IMS.
Con estos cambios en su lugar, y el JSON de credenciales de servicio descargado de AEM Developer Console (y, para mayor simplicidad, guardado como service_token.json
la misma carpeta que esta index.js
), ejecute la aplicación reemplazando el parámetro de línea de comandos file
con service_token.json
y actualice la variable propertyValue
a un nuevo valor para que los efectos se muestren en AEM.
$ node index.js \
aem=https://author-p1234-e5678.adobeaemcloud.com \
folder=/wknd/en/adventures/napa-wine-tasting \
propertyName=metadata/dc:rights \
propertyValue="WKND Restricted Use" \
file=service_token.json
La salida al terminal tendrá el siguiente aspecto:
200 - OK @ https://author-p1234-e5678.adobeaemcloud.com/api/assets/wknd/en/adventures/napa-wine-tasting.json
403 - Forbidden @ https://author-p1234-e5678.adobeaemcloud.com/api/assets/wknd/en/adventures/napa-wine-tasting/AdobeStock_277654931.jpg.json
403 - Forbidden @ https://author-p1234-e5678.adobeaemcloud.com/api/assets/wknd/en/adventures/napa-wine-tasting/AdobeStock_239751461.jpg.json
403 - Forbidden @ https://author-p1234-e5678.adobeaemcloud.com/api/assets/wknd/en/adventures/napa-wine-tasting/AdobeStock_280313729.jpg.json
403 - Forbidden @ https://author-p1234-e5678.adobeaemcloud.com/api/assets/wknd/en/adventures/napa-wine-tasting/AdobeStock_286664352.jpg.json
La variable 403 - Prohibido indica errores en las llamadas de API HTTP a AEM as a Cloud Service. Estos 403 errores prohibidos se producen al intentar actualizar los metadatos de los recursos.
El motivo de esto es que el token de acceso derivado de Credenciales de Servicio autentica la solicitud de AEM mediante una cuenta técnica creada automáticamente AEM usuario que, de forma predeterminada, solo tiene acceso de lectura. Para que la aplicación tenga acceso de escritura a AEM, se debe conceder permiso en AEM a la cuenta técnica AEM usuario asociado con el token de acceso.
El token de acceso derivado de Credenciales de servicio utiliza una cuenta técnica AEM Usuario que pertenece al grupo de usuarios Colaboradores AEM.
Una vez que la cuenta técnica AEM usuario existe en AEM (después de la primera solicitud HTTP con el token de acceso), los permisos de este AEM usuario se pueden administrar del mismo modo que otros usuarios AEM.
integration.email
, que debería tener un aspecto similar a: 12345678-abcd-9000-efgh-0987654321c@techacct.adobe.com
.Con la cuenta técnica autorizada en AEM para tener permisos de escritura en los recursos, vuelva a ejecutar la aplicación:
$ node index.js \
aem=https://author-p1234-e5678.adobeaemcloud.com \
folder=/wknd/en/adventures/napa-wine-tasting \
propertyName=metadata/dc:rights \
propertyValue="WKND Restricted Use" \
file=service_token.json
La salida al terminal tendrá el siguiente aspecto:
200 - OK @ https://author-p1234-e5678.adobeaemcloud.com/api/assets/wknd/en/adventures/napa-wine-tasting.json
200 - OK @ https://author-p1234-e5678.adobeaemcloud.com/api/assets/wknd/en/adventures/napa-wine-tasting/AdobeStock_277654931.jpg.json
200 - OK @ https://author-p1234-e5678.adobeaemcloud.com/api/assets/wknd/en/adventures/napa-wine-tasting/AdobeStock_286664352.jpg.json
200 - OK @ https://author-p1234-e5678.adobeaemcloud.com/api/assets/wknd/en/adventures/napa-wine-tasting/AdobeStock_239751461.jpg.json
200 - OK @ https://author-p1234-e5678.adobeaemcloud.com/api/assets/wknd/en/adventures/napa-wine-tasting/AdobeStock_280313729.jpg.json
aem
parámetro de línea de comandos)folder
parámetro de línea de comandos, por ejemplo WKND > Inglés > Aventuras > Ayuno de vino de Napametadata/dc:rights
La propiedad JCR, que ahora refleja el valor proporcionado en la variable propertyValue
parámetro, por ejemplo Uso restringido de WKNDAhora que hemos accedido mediante programación a AEM as a Cloud Service mediante un token de acceso de desarrollo local, así como un token de acceso de servicio a servicio listo para la producción.