Generare un token di accesso JWT nell’azione App Builder
Potrebbe essere necessario che le azioni App Builder interagiscano con le API Adobe associate ai progetti Adobe Developer Console in cui viene distribuita anche l’app App Builder.
Potrebbe essere necessario che l’azione App Builder generi un token di accesso JWT associato al progetto Adobe Developer Console desiderato.
file .env
Nel file .env
del progetto App Builder, aggiungi le chiavi personalizzate per ciascuna delle credenziali JWT del progetto Adobe Developer Console. I valori delle credenziali JWT possono essere ottenuti dalle credenziali > account di servizio (JWT) del progetto Adobe Developer Console per una determinata area di lavoro.
...
JWT_CLIENT_ID=58b23182d80a40fea8b12bc236d71167
JWT_CLIENT_SECRET=p8e-EIRF6kY6EHLBSdw2b-pLUWKodDqJqSz3
JWT_TECHNICAL_ACCOUNT_ID=1F072B8A63C6E0230A495EE1@techacct.adobe.com
JWT_IMS_ORG=7ABB3E6A5A7491460A495D61@AdobeOrg
JWT_METASCOPES=https://ims-na1.adobelogin.com/s/ent_analytics_bulk_ingest_sdk,https://ims-na1.adobelogin.com/s/event_receiver_api
JWT_PRIVATE_KEY=LS0tLS1C..kQgUFJJVkFURSBLRVktLS0tLQ==
I valori per JWT_CLIENT_ID
, JWT_CLIENT_SECRET
, JWT_TECHNICAL_ACCOUNT_ID
, JWT_IMS_ORG
possono essere copiati direttamente dalla schermata delle credenziali JWT del progetto Adobe Developer Console.
Metascopi
Determina le API Adobe e i relativi metascopi con cui l’azione App Builder interagisce. Elenca i metascopi con delimitatori di virgola nella chiave JWT_METASCOPES
. I metascopi validi sono elencati nella documentazione JWT Metascope di Adobe.
Ad esempio, il seguente valore potrebbe essere aggiunto alla chiave JWT_METASCOPES
in .env
:
...
JWT_METASCOPES=https://ims-na1.adobelogin.com/s/ent_analytics_bulk_ingest_sdk,https://ims-na1.adobelogin.com/s/event_receiver_api
...
Chiave privata
JWT_PRIVATE_KEY
deve essere formattato in modo particolare in quanto è un valore nativo a più righe, non supportato nei file .env
. Il modo più semplice è codificare la chiave privata in base64. La codifica Base64 della chiave privata (-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----
) può essere eseguita utilizzando gli strumenti nativi forniti dal sistema operativo.
-
Apri
Terminal
-
Esegui il comando
base64 -i /path/to/private.key | pbcopy
-
L'output base64 viene automaticamente copiato negli Appunti
-
Incolla in
.env
come valore della chiave corrispondente
-
Apri
Command Prompt
-
Esegui il comando
certutil -encode C:\path\to\private.key C:\path\to\encoded-private.key
-
Esegui il comando
findstr /v CERTIFICATE C:\path\to\encoded-private.key
-
Copiare l'output base64 negli Appunti
-
Incolla in
.env
come valore della chiave corrispondente
-
Apri terminale
-
Esegui il comando
base64 private.key
-
Copiare l'output base64 negli Appunti
-
Incolla in
.env
come valore della chiave corrispondente
Ad esempio, la seguente chiave privata con codifica base64 potrebbe essere aggiunta alla chiave JWT_PRIVATE_KEY
in .env
:
...
JWT_PRIVATE_KEY=LS0tLS1C..kQgUFJJVkFURSBLRVktLS0tLQ==
Mappatura degli input
Con il valore delle credenziali JWT impostato nel file .env
, è necessario mapparle agli input delle azioni AppBuilder per consentirne la lettura 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
JWT_CLIENT_ID: $JWT_CLIENT_ID
JWT_TECHNICAL_ACCOUNT_ID: $JWT_TECHNICAL_ACCOUNT_ID
JWT_IMS_ORG: $JWT_IMS_ORG
JWT_METASCOPES: $JWT_METASCOPES
JWT_PRIVATE_KEY: $JWT_PRIVATE_KEY
annotations:
require-adobe-auth: false
final: true
Le chiavi definite in inputs
sono disponibili nell'oggetto params
fornito per l'azione App Builder.
Credenziali JWT per accedere al token
Nell'azione App Builder, le credenziali JWT sono disponibili nell'oggetto params
e utilizzabili da @adobe/jwt-auth
per generare un token di accesso, che a sua volta può accedere ad altre API e servizi Adobe.
const fetch = require("node-fetch");
const { Core } = require("@adobe/aio-sdk");
const { errorResponse, stringParameters, checkMissingRequestInputs } = require("../utils");
const auth = require("@adobe/jwt-auth");
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, [
"JWT_CLIENT_ID", "JWT_TECHNICAL_ACCOUNT_ID", "JWT_IMS_ORG", "JWT_CLIENT_SECRET", "JWT_METASCOPES", "JWT_PRIVATE_KEY"], []);
// Split the metascopes into an array (they are comma delimited in the .env file)
const metascopes = params.JWT_METASCOPES?.split(',') || [];
// Base64 decode the private key value
const privateKey = Buffer.from(params.JWT_PRIVATE_KEY, 'base64').toString('utf-8');
// Exchange the JWT credentials for an 24-hour Access Token
let { accessToken } = await auth({
clientId: params.JWT_CLIENT_ID, // Client Id
technicalAccountId: params.JWT_TECHNICAL_ACCOUNT_ID, // Technical Account Id
orgId: params.JWT_IMS_ORG, // Adobe IMS Org Id
clientSecret: params.JWT_CLIENT_SECRET, // Client Secret
metaScopes: metascopes, // Metadcopes defining level of access the access token should provide
privateKey: privateKey, // Private Key to sign the JWT
});
// The 24-hour IMS Access Token is used to call the Analytics APIs
// Can look at caching this token for 24 hours to reduce calls
const accessToken = await getAccessToken(params);
// Invoke an exmaple Adobe API endpoint using the generated accessToken
const res = await fetch('https://analytics.adobe.io/api/example/reports', {
headers: {
"Accept": "application/json",
"Content-Type": "application/json",
"X-Proxy-Global-Company-Id": 'example',
"Authorization": `Bearer ${accessToken}`,
"x-Api-Key": params.JWT_CLIENT_ID,
},
method: "POST",
body: JSON.stringify({... An Analytics query ... }),
});
if (!res.ok) { throw new Error("Request to API failed with status code " + res.status);}
// Analytics API data
let data = await res.json();
const response = {
statusCode: 200,
body: data,
};
return response;
} catch (error) {
logger.error(error);
return errorResponse(500, "server error", logger);
}
}
exports.main = main;