Gerar token de acesso de servidor para servidor na ação do App Builder

As ações do App Builder podem precisar interagir com APIs Adobe que oferecem suporte a credenciais de servidor para servidor do OAuth e estão associadas a projetos do Adobe Developer Console nos quais o aplicativo App Builder está implantado.

Este guia explica como gerar um token de acesso usando as credenciais de Servidor para Servidor do OAuth para usar em uma ação do App Builder.

IMPORTANT
As credenciais da Conta de serviço (JWT) foram substituídas pelas credenciais de servidor para servidor do OAuth. No entanto, ainda há algumas APIs de Adobe que só oferecem suporte às credenciais da Conta de serviço (JWT) e a migração para o servidor OAuth está em andamento. Consulte a documentação da API de Adobe para entender quais credenciais são compatíveis.

Configurações de projeto do Adobe Developer Console

Ao adicionar a API de Adobe desejada ao projeto do Adobe Developer Console, na etapa Configurar API, selecione o tipo de autenticação Servidor para servidor OAuth.

Adobe Developer Console - Servidor a Servidor OAuth

Para atribuir a conta de serviço de integração criada automaticamente acima, selecione o perfil de produto desejado. Assim, por meio do perfil do produto, as permissões da conta de serviço são controladas.

Adobe Developer Console - Perfil de Produto

arquivo .env

No arquivo .env do projeto do App Builder, anexe chaves personalizadas para as credenciais de servidor para servidor do OAuth do projeto do Adobe Developer Console. Os valores de credencial de servidor para servidor do OAuth podem ser obtidos das Credenciais > Servidor para servidor do OAuth do projeto do Adobe Developer Console para um determinado espaço de trabalho.

Credenciais de servidor para servidor do Adobe Developer Console OAuth

...
OAUTHS2S_CLIENT_ID=58b23182d80a40fea8b12bc236d71167
OAUTHS2S_CLIENT_SECRET=p8e-EIRF6kY6EHLBSdw2b-pLUWKodDqJqSz3
OAUTHS2S_CECREDENTIALS_METASCOPES=AdobeID,openid,ab.manage,additional_info.projectedProductContext,read_organizations,read_profile,account_cluster.read

Os valores de OAUTHS2S_CLIENT_ID, OAUTHS2S_CLIENT_SECRET, OAUTHS2S_CECREDENTIALS_METASCOPES podem ser copiados diretamente da tela de Credenciais de Servidor para Servidor OAuth do projeto do Adobe Developer Console.

Mapeamento de entradas

Com o valor da credencial de servidor para servidor OAuth definido no arquivo .env, ele deve ser mapeado para entradas de ação do AppBuilder para que possa ser lido na própria ação. Para fazer isso, adicione entradas para cada variável na ação ext.config.yaml inputs no formato: PARAMS_INPUT_NAME: $ENV_KEY.

Por exemplo:

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
            OAUTHS2S_CLIENT_ID: $OAUTHS2S_CLIENT_ID
            OAUTHS2S_CLIENT_SECRET: $OAUTHS2S_CLIENT_SECRET
            OAUTHS2S_CECREDENTIALS_METASCOPES: $OAUTHS2S_CECREDENTIALS_METASCOPES
          annotations:
            require-adobe-auth: false
            final: true

As chaves definidas em inputs estão disponíveis no objeto params fornecido para a ação App Builder.

Credenciais de servidor para servidor do OAuth para acessar o token

Na ação do App Builder, as credenciais de Servidor para Servidor do OAuth estão disponíveis no objeto params. Usando essas credenciais, o token de acesso pode ser gerado usando bibliotecas do OAuth 2.0. Ou você pode usar a biblioteca de Busca de Nós para fazer uma solicitação POST ao ponto de extremidade do token do Adobe IMS para obter o token de acesso.

O exemplo a seguir demonstra como usar a biblioteca node-fetch para fazer uma solicitação POST para o ponto de extremidade do token do Adobe IMS para obter o token de acesso.

const fetch = require("node-fetch");
const { Core } = require("@adobe/aio-sdk");
const { errorResponse, stringParameters, checkMissingRequestInputs } = require("../utils");

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, ["OAUTHS2S_CLIENT_ID", "OAUTHS2S_CLIENT_SECRET", "OAUTHS2S_CECREDENTIALS_METASCOPES"], []);

    // The Adobe IMS token endpoint URL
    const adobeIMSV3TokenEndpointURL = 'https://ims-na1.adobelogin.com/ims/token/v3';

    // The POST request options
    const options = {
        method: 'POST',
        headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
        },
        body: `grant_type=client_credentials&client_id=${params.OAUTHS2S_CLIENT_ID}&client_secret=${params.OAUTHS2S_CLIENT_SECRET}&scope=${params.OAUTHS2S_CECREDENTIALS_METASCOPES}`,
    };

    // Make a POST request to the Adobe IMS token endpoint to get the access token
    const tokenResponse = await fetch(adobeIMSV3TokenEndpointURL, options);
    const tokenResponseJSON = await tokenResponse.json();

    // The 24-hour IMS Access Token is used to call the AEM Data Service API
    // Can look at caching this token for 24 hours to reduce calls
    const accessToken = tokenResponseJSON.access_token;

    // Invoke an AEM Data Service API using the access token
    const aemDataResponse = await fetch(`https://api.adobeaemcloud.com/adobe/stats/statistics/contentRequestsQuota?imsOrgId=${IMS_ORG_ID}&current=true`, {
      headers: {
        'X-Adobe-Accept-Experimental': '1',
        'x-gw-ims-org-id': IMS_ORG_ID,
        'X-Api-Key': params.OAUTHS2S_CLIENT_ID,
        Authorization: `Bearer ${access_token}`, // The 24-hour IMS Access Token
      },
      method: "GET",
    });

    if (!aemDataResponse.ok) { throw new Error("Request to API failed with status code " + aemDataResponse.status);}

    // API data
    let data = await aemDataResponse.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