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.

IMPORTANT
Rivedi la documentazione sulla sicurezza di App Builder per capire quando è opportuno generare i token di accesso rispetto all'utilizzo dei token di accesso forniti.
L’azione personalizzata potrebbe dover fornire propri controlli di sicurezza per garantire che solo i consumatori autorizzati possano accedere all’azione App Builder e ai relativi servizi.

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.

Credenziali servizio JWT Adobe Developer Console

...
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.

macOS
  1. Apri Terminal

  2. Esegui il comando base64 -i /path/to/private.key | pbcopy

  3. L'output base64 viene automaticamente copiato negli Appunti

  4. Incolla in .env come valore della chiave corrispondente

Windows
  1. Apri Command Prompt

  2. Esegui il comando certutil -encode C:\path\to\private.key C:\path\to\encoded-private.key

  3. Esegui il comando findstr /v CERTIFICATE C:\path\to\encoded-private.key

  4. Copiare l'output base64 negli Appunti

  5. Incolla in .env come valore della chiave corrispondente

Linux®
  1. Apri terminale

  2. Esegui il comando base64 private.key

  3. Copiare l'output base64 negli Appunti

  4. 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;
recommendation-more-help
4859a77c-7971-4ac9-8f5c-4260823c6f69