Integra la CRM de Salesforce con funciones de Cloud Functions protegidas en empresas

En este instructivo, se muestra un enfoque para ayudar a proteger las funciones de Cloud Functions que se invocan desde servicios alojados fuera de Google Cloud. Entre los casos prácticos comunes, se incluyen la invocación de funciones de Cloud Functions desde apps de software como servicio (SaaS), como sistemas de administración de relaciones con clientes (CRM), sistemas de socios o apps web orientadas al consumidor.

Este instructivo está dirigido a arquitectos, propietarios de productos y profesionales de TI. Se describe cómo invocar una función de Cloud Functions desde una fuente externa y, también, se analizan casos prácticos comunes en los que se usa Cloud Functions.

En el instructivo, se supone que conoces Cloud Functions, Salesforce, Node.js y las API de REST.

Objetivos

  • Implementar una función de Cloud Functions que pueda ser invocada por un servicio externo
  • Controla el acceso a la función con los permisos de administración de identidades y accesos (IAM).
  • Crear una solicitud de Token web de JSON (JWT) y, luego, invocar la función de Cloud Functions mediante tokens de ID de servicios externos
  • Verificar que solo los servicios autorizados puedan acceder a la función protegida

Costos

En este instructivo, se usan los siguientes componentes facturables de Google Cloud:

  • Cloud Functions

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios. Es posible que los usuarios nuevos de Google Cloud sean aptos para obtener una prueba gratuita.

Antes de comenzar

  1. Accede a tu Cuenta de Google.

    Si todavía no tienes una cuenta, regístrate para obtener una nueva.

  2. En la página del selector de proyectos de Google Cloud Console, selecciona o crea un proyecto de Google Cloud.

    Ir a la página del selector de proyectos

  3. Comprueba que la facturación esté habilitada en tu proyecto.

    Descubre cómo puedes habilitar la facturación

  4. Habilita la API Cloud Functions.

    Habilita la API

Introducción

Cloud Functions te permite ejecutar el código en Google Cloud y, también, invocar las funciones a pedido o como respuesta a eventos.

Las empresas suelen tener una amplia gama de plataformas y apps en su ecosistema tecnológico. La integración de estas plataformas y de los datos de la empresa que contienen suele ser clave para la agilidad empresarial. Proteger y resguardar los datos de la empresa y el movimiento de datos entre apps es fundamental para las organizaciones. Cuando integras las apps empresariales (como la CRM de Salesforce) en Cloud Functions, debes tomar medidas para proteger la invocación de las funciones a fin de controlar cómo y quién puede invocarlas.

Un mecanismo de control de acceso bien diseñado tiene muchos beneficios. Ayuda a reducir la superficie de ataque y emplea los principios de privilegio mínimo. También establece mecanismos de seguridad y control y ayuda a que los costos sean más predecibles, ya que se puede limitar la lista de invocadores permitidos.

Para obtener información sobre cómo agregar control de acceso a Cloud Functions, en este instructivo verás cómo invocar una función protegida de Cloud Functions desde la CRM de Salesforce. La función se invoca cuando se crea un registro de cliente nuevo en la plataforma de la CRM de Salesforce y se publica en el sistema de registros (un cliente principal) de Google Cloud para su procesamiento. Si bien este instructivo se centra en el uso de la CRM de Salesforce, el enfoque que se adopta en esta solución se puede aplicar para llamar a funciones de Cloud Functions desde otras apps de SaaS.

Para simplificar, la función de Cloud Functions que se usa se proporciona en un repositorio de GitHub.

Arquitectura

En la siguiente figura, se describen la arquitectura y los pasos clave para invocar una función protegida de Cloud Functions desde un servicio externo. Se pueden implementar instancias de la función de Cloud Functions de forma privada para que solo los usuarios y servicios autorizados puedan invocar estas funciones.

Arquitectura de este método en la que se muestran los pasos necesarios para realizar la autenticación y llamar a la función de Cloud Function.

Los pasos del diagrama se describen a continuación:

  1. El servicio externo de Salesforce solicita un token de ID mediante un JWT firmado.
  2. Si el JWT es válido, se muestra un token de ID firmado del servidor de autorización de Google.
  3. El servicio de Salesforce usa el token de ID para realizar una solicitud a la API a la función protegida de Cloud Functions.
  4. El contenedor de la función de Cloud Functions valida a nivel interno el token de ID que se envía en el encabezado del portador de la autorización mediante un servicio de Salesforce.
  5. La función de Cloud Functions se ejecuta en función de la validez del token:
    • Si el token es válido, se ejecuta el código de la función de Cloud Functions y se muestra una respuesta exitosa al servicio que realiza la llamada. Se pueden invocar otros servicios de Google Cloud desde la función de Cloud Functions según sea necesario.
    • Si el token no es válido, se muestra una respuesta de código de estado HTTP 401403 y el código de la función de Cloud Functions no se ejecuta.

A los fines de este instructivo, el servicio externo que llama a la función de Cloud Functions se aloja en la plataforma de Salesforce. Cuando se crea un registro de cliente en la CRM de Salesforce, se activa la canalización y se invocan los pasos indicados en el diagrama. La CRM de Salesforce posee la clave privada de la cuenta de servicio de Google Cloud y realiza los pasos descritos en el diagrama a fin de llamar a la función protegida de Cloud Functions. Para hacerlo, debes usar una clase Apex de Salesforce.

Cuando se crea un registro de cliente en la CRM de Salesforce, un activador de Apex hace que un trabajo que se puede poner en cola y que se encuentra en la clase Apex (GCPManageCustomersService) se ejecute de forma asíncrona.

Casos prácticos comunes para invocar funciones protegidas de Cloud Functions

Se pueden integrar funciones de Cloud Functions en tu ecosistema, en el que pueden representar un componente fundamental del proceso empresarial de extremo a extremo. Puedes usar Cloud Functions para tareas como las siguientes:

  • Insertar datos de la empresa en Google Cloud para su almacenamiento y procesamiento analítico, como los registros de cliente de los sistemas frontend de CRM

  • Crear o actualizar datos de clientes almacenados en servicios de copia de seguridad, como Firestore y Cloud SQL, cuando esos servicios funcionen como instancias principales de clientes (es decir, como el sistema de registro)

  • Recuperar datos transaccionales como pedidos, solicitudes de servicio, citas de servicio y detalles del producto de almacenes de datos en Google Cloud. Puedes seguir estos pasos para crear vistas de cliente de 360 grados en una plataforma de SaaS como Salesforce

  • Transformar archivos de datos provenientes de organizaciones asociadas que deben analizarse, procesarse y, luego, cargarse a un data lake o almacén de datos en Google Cloud

  • Analizar datos de interacción del usuario, como envíos de formularios o imágenes y documentos a un sitio web para generar estadísticas mediante BigQuery y BigQuery ML

En este instructivo, implementarás el primer caso práctico: insertar datos de la empresa en Google Cloud. Cuando se crean los datos de cliente en la CRM de Salesforce, se envían a Google Cloud a través de la invocación de una función protegida de Cloud Functions.

El nuevo registro de clientes se puede procesar según sea necesario en Google Cloud. Algunos patrones comunes incluyen la inserción del registro de clientes en una instancia principal de clientes para su procesamiento analítico, como Cloud SQL, Firestore o BigQuery. Este instructivo no incluye ninguna sección sobre cómo procesar estos registros.

Inicializa un entorno

  1. En Cloud Console, haz clic en Activar Cloud Shell:

    Abrir Cloud Shell

    Usa Cloud Shell para todos los comandos de la terminal en este instructivo.

  2. En Cloud Shell, establece el proyecto que creaste o seleccionaste como predeterminado. Reemplaza project-id por el ID del proyecto de Cloud.

    gcloud config set project project-id
    
  3. Asigna la configuración predeterminada para región y zona:

    gcloud config set run/region us-central1
    gcloud config set compute/zone us-central1-a
    

    En este instructivo, debes usar us-central1 como la región predeterminada y us-central1-a como la zona predeterminada.

Crea la función protegida de Cloud Functions

El primer paso es crear la función de Cloud Functions que invocarás más tarde.

Clona el repositorio de código fuente

  1. En Cloud Shell, clona el repositorio de GitHub que contiene los artefactos de muestra de Cloud Functions y Salesforce:

    git clone https://github.com/GoogleCloudPlatform/salesforce-cloud-functions-crm-tutorial
    
  2. Cambia al directorio que se creó cuando se clonó el repositorio:

    cd salesforce-cloudfunc-integration
    

Revisa el código en el directorio

El directorio contiene dos directorios, uno llamado salesforce y otro llamado manage-customer-func. El directorio salesforce tiene los siguientes archivos de código de Apex de Salesforce:

  • Archivo CustomerAccounts.trigger. Contiene un código que activa un trabajo que se puede poner en cola en la clase GCPManageCustomersService cuando se crea una cuenta de cliente nueva.
  • Clase GCPManageCustomersService. Contiene un código para solicitar un token de ID de Google a cambio de un JWT generado y, también, invoca la función de Cloud Functions.
  • Archivos de metadatos XML de Salesforce.

El directorio manage-customer-func tiene los archivos de código Node.js de la función secureFunction de Cloud Functions, junto con los archivos de empaquetado que describen las dependencias de dicha función.

Crea una cuenta de servicio para el servicio externo de Salesforce a fin de invocar la función

Es una buena práctica administrar con precisión el acceso a los servicios y recursos implementados en Google Cloud en función del principio de privilegio mínimo. En esta sección, crearás una cuenta de servicio para el servicio externo de SaaS que accede a la función de Cloud Functions.

Console

  1. En Cloud Console, ve a la página Cuentas de servicio.

    Ir a la página Cuentas de servicio

  2. Haz clic en Selecciona un proyecto y selecciona el que creaste para este instructivo.

  3. Haz clic en Crear cuenta de servicio.

  4. Ingresa el nombre de la cuenta de servicio function-invoker-sa.

  5. Haz clic en Crear.

  6. Selecciona la función Invocador de Cloud Functions en esta cuenta de servicio y, luego, haz clic en Guardar.

  7. Haz clic en Continuar.

  8. Haz clic en Crear clave, selecciona P12 en el Tipo de clave y, luego, haz clic en Crear.

    El archivo de claves P12 se descarga en tu disco local.

    Anota la contraseña predeterminada que genera Google Cloud (que suele ser notasecret).

  9. Haz clic en Listo para finalizar la creación de la cuenta de servicio.

  10. En Cloud Shell, haz clic en Más  y selecciona Subir archivo.

  11. Para subir el archivo a Cloud Shell, selecciona el archivo de claves project-id-NNNNNN.p12 que descargaste antes y haz clic en Abrir. (La string NNNNNN es un conjunto de números que se generan como parte del nombre del archivo de claves).

  12. En Cloud Shell, ve al directorio principal:

    cd $HOME
    
  13. Cambia el nombre del archivo de claves que acabas de subir para usar un nombre más reconocible más adelante en el instructivo:

    mv ${DEVSHELL_PROJECT_ID}-NNNNNN.p12 external-service-invoker-sa.p12
    

gcloud

  1. Ve al directorio principal:

    cd $HOME
    
  2. Crea una variable de entorno para almacenar el nombre de la cuenta de servicio que crearás:

    export SERVICE_ACCOUNT_NAME=function-invoker-sa
    
  3. Crea una cuenta de servicio:

    gcloud beta iam service-accounts create ${SERVICE_ACCOUNT_NAME} \
        --display-name ${SERVICE_ACCOUNT_NAME}
    
  4. Genera una clave P12 para la cuenta de servicio y descárgala mediante la ejecución del siguiente comando:

    gcloud iam service-accounts keys create ~/external-service-invoker-sa.p12 \
        --key-file-type p12 \
        --iam-account ${SERVICE_ACCOUNT_NAME}@${DEVSHELL_PROJECT_ID}.iam.gserviceaccount.com
    

    La clave P12 se descarga en el directorio principal ($HOME) de Cloud Shell. En el resultado que verás en Cloud Shell, también se muestra la ubicación en la que se descargó la clave.

Implementa la función de Cloud Functions

La función de Cloud Functions se implementa como una función protegida. Solo los usuarios y las cuentas de servicio que tengan permiso para acceder a ella podrán invocarla. En el siguiente paso, debes configurar el acceso a IAM para definir los permisos.

  1. En Cloud Shell, cambia al directorio de manage-customer-func:

    cd manage-customer-func
    
  2. Para implementar la función, ejecuta este comando:

    gcloud functions deploy secureFunction \
        --runtime nodejs8 \
        --trigger-http
    
  3. Comprueba que la función se haya implementado de forma correcta. Para eso, usa el siguiente comando:

    gcloud functions describe secureFunction
    

    Un estado similar al siguiente indica que la implementación se realizó de forma correcta:

    status:  ACTIVE
    timeout:  60s
    httpsTrigger:
      url: https://us-central1-[PROJECT_ID].cloudfunctions.net/secureFunction
    

    Anota la URL httpsTrigger. La necesitarás más tarde.

Otorga acceso a la función implementada

A continuación, asignarás a la cuenta de servicio que creaste una función correspondiente para acceder a la función secureFunction de Cloud Functions. También quitarás la cuenta allUsers que se agrega de forma automática. Como consecuencia, solo la cuenta de servicio podrá invocar la función de Cloud Functions.

Console

  1. En Cloud Console, abre la página de Cloud Functions.

    Ir a la página de Cloud Functions

  2. Selecciona secureFunction en la lista de funciones.

  3. Si el Panel de información no está abierto, haz clic en Mostrar panel de información en la barra de herramientas.

  4. En la pestaña Permisos, haz clic en Agregar miembros.

  5. En el cuadro Nuevos miembros, escribe function-invoker-sa para buscar la cuenta de servicio que necesita acceder a la función y, luego, selecciónala.

  6. En la lista Seleccionar una función, selecciona Cloud Functions y, luego, la función Invocador de Cloud Functions.

  7. Haz clic en Guardar.

  8. En la pestaña Permisos, expande la función Invocador de Cloud Functions.

  9. En la fila del miembro allUsers, haz clic en el botón Borrar y, luego, en Quitar para confirmar. Así se quita el acceso público a esta función.

gcloud

  1. Asigna la función Invocador de Cloud Functions a la cuenta de servicio que creaste para permitirle acceder a la función implementada:

    gcloud beta functions add-iam-policy-binding secureFunction \
        --member=serviceAccount:${SERVICE_ACCOUNT_NAME}@${DEVSHELL_PROJECT_ID}.iam.gserviceaccount.com \
        --role=roles/cloudfunctions.invoker
    
  2. Quita al miembro allUsers de la función Invocador de Cloud Functions mediante la ejecución del siguiente comando:

    gcloud beta functions remove-iam-policy-binding secureFunction \
        --member=allUsers \
        --role=roles/cloudfunctions.invoker
    

Crea un servicio de Salesforce para invocar la función protegida

En la organización de Salesforce, debes configurar el código Apex necesario para invocar el flujo del proceso empresarial. Debes usar la CLI de Salesforce (SFDX) para implementar el código de Salesforce y la configuración necesaria en una organización de scratch. Si lo deseas, luego puedes ascender estos cambios implementados a entornos de producción.

En la siguiente lista, se resumen las tareas que debes realizar en la organización de Salesforce. Las instrucciones detalladas de esta sección te guiarán a través de cada tarea.

  1. Configura la CLI de Salesforce.
  2. Crea una organización de scratch y envía el código desde el repositorio clonado hasta esa organización.
  3. Crea una clave de almacén de claves de Java (JKS) a partir de la clave P12 de la cuenta de servicio de Google Cloud exportada y, luego, importa la clave JKS al servicio de Salesforce.
  4. Propaga el objeto de tipo de metadatos personalizados con datos relevantes a la configuración de Google Cloud. Esto incluye el extremo de la función que se va a invocar, el correo electrónico de la cuenta de servicio y el extremo del token que el servicio de Salesforce puede usar para solicitar un token de ID.
  5. Revisa la clase Apex que se creó y asegúrate de que en el código Apex se haga referencia de forma correcta a los nombres del campo del tipo de metadatos personalizados y al nombre de la clave JKS.
  6. Crea un registro de cliente en la CRM de Salesforce. De esta manera, se invoca el código CustomerAccounts.trigger, que inicia el proceso de envío de los datos nuevos del registro de cliente a Google Cloud.

Configura la CLI de Salesforce

En esta sección, instalarás la CLI de Salesforce y configurarás la autorización correspondiente.

Instala la CLI de Salesforce

  1. En Cloud Shell, ve al directorio principal:

    cd $HOME
    
  2. Instala la CLI de Salesforce en tu sesión de Cloud Shell:

    wget https://developer.salesforce.com/media/salesforce-cli/sfdx-linux-amd64.tar.xz
    
  3. Descomprime el archivo tar descargado mediante la ejecución del siguiente comando:

    tar -xvf sfdx-linux-amd64.tar.xz
    
  4. Usa el siguiente comando para agregar el objeto binario de Salesforce a la ruta:

    export PATH="$PATH:${HOME}/sfdx-cli-v7.8.1-8f830784cc-linux-x64/bin"
    

    Ahora puedes ejecutar comandos mediante la CLI de Salesforce.

  5. Verifica que la CLI se haya configurado de forma correcta:

    sfdx
    

    A continuación, se muestra el resultado:

    Lista de terminales que muestra el resultado del comando de SFDX, que incluye la versión, el uso, los comandos y los temas.

    Verás la información de la versión y una lista de comandos.

  6. En Setup (Configuración) en la organización de Salesforce, ingresa Dev Hub en Quick Find (Búsqueda rápida) y, luego, selecciona Dev Hub:

    Buscar “Dev” en el panel de Salesforce

  7. Habilita Dev Hub:

    Habilita Dev Hub mediante el interruptor para activar o desactivar “Dev Hub”

    Este paso te permite configurar una organización de scratch a fin de implementar el código en el instructivo.

  8. En Cloud Shell, genera un certificado y un par de claves para autenticarte en la organización de Salesforce desde la CLI de SFDX:

    openssl req -x509 -sha256 -nodes -days 36500 -newkey \
       rsa:2048 -keyout salesforce.key -out \
       salesforce.crt
    

    Se te pedirá que ingreses los detalles para identificar el certificado. A los fines de este instructivo, estos valores no son importantes, por lo que debes presionar Intro para aceptar los valores predeterminados.

  9. En Cloud Shell, haz clic en Más  y selecciona Descargar archivo.

  10. En el cuadro Ruta de acceso al archivo completamente calificada, ingresa el siguiente nombre de archivo y haz clic en Descargar:

    salesforce.crt
    

    Así se descarga el certificado que generaste en tu máquina local. Debes subir el certificado a tu organización de Salesforce en el siguiente procedimiento.

Crea una app de conexión en la organización de Salesforce (Dev Hub) para autorizar la CLI de Salesforce

  1. En función de la edición de la organización de Salesforce, sigue uno de estos pasos para crear una app conectada:

    • En Lightning Experience, usa el Administrador de apps para crear apps conectadas. En Configuración en la organización de Salesforce, en el cuadro Búsqueda rápida, ingresa App y, luego, selecciona Administrador de apps. Haz clic en Nueva app conectada.
    • En Salesforce Classic, desde la Configuración en la organización de Salesforce, en el cuadro Búsqueda rápida, ingresa Apps y, luego, selecciona Apps (en Compilación y, por último, presiona Crear). En el panel Apps conectadas, haz clic en Nuevo.
  2. Ingresa la información del correo electrónico de contacto y cualquier otra información correspondiente a la app.

  3. Selecciona Habilitar configuración de OAuth.

  4. Para el valor URL de devolución de llamada, ingresa http://localhost:1717/OauthRedirect.

  5. Para habilitar la opción de usar firmas digitales, haz clic en Elegir archivo y, luego, selecciona el archivo de certificado salesforce.crt que descargaste antes.

    Este certificado sirve como la clave pública que se usa para autenticar y conectar el cliente de SFDX que se ejecuta en una sesión de Cloud Shell a la organización Dev Hub de Salesforce.

  6. Agrega los siguientes permisos de OAuth a los Alcances seleccionados de OAuth. Para hacerlo, haz clic en estos y, luego, en la flecha Agregar a fin de seleccionarlos:

    • Acceder y administrar datos (API)
    • Realizar solicitudes en tu nombre en cualquier momento (refresh_token, offline_access)
    • Proporcionar acceso a los datos a través de la Web (web)

      Los permisos seleccionados de OAuth que figuran en el reloj de Salesforce.

  7. Haz clic en Guardar.

  8. Anota la clave de consumidor que se muestra.

  9. Haz clic en Administrar y, luego, en Editar políticas para cambiar las políticas de OAuth.

  10. Configura los Usuarios permitidos como Usuarios autorizados por el administrador con autorización previa y confirma la elección.

  11. Establece la relajación de IP en Restricciones de relajación de IP.

  12. Haz clic en Guardar.

  13. Haz clic en Administrar perfiles y agrega el perfil Administrador del sistema.

    Esto permite que los usuarios que usan este perfil accedan a la CLI de SFDX.

  14. Haz clic en Guardar.

Completa los pasos de autorización para la CLI de Salesforce

  1. En Cloud Shell, crea una variable de entorno para conservar la clave de consumidor que creó la app conectada en el paso anterior:

    export CONSUMER_KEY=your-consumer-key
    

    Reemplaza your-consumer-key por tu clave de consumidor.

  2. Crea una variable de entorno para conservar el nombre de usuario de la organización de Salesforce que creaste antes en este instructivo:

    export SALESFORCE_USERNAME=your-salesforce-username
    

    Reemplaza your-salesforce-username por tu nombre de usuario de Salesforce.

  3. En Cloud Shell, autentícate en la organización de Salesforce mediante una concesión de JWT:

    sfdx force:auth:jwt:grant \
        -u ${SALESFORCE_USERNAME} \
        -f $(pwd)/salesforce.key -i ${CONSUMER_KEY}
    

    Verás un mensaje que indica que tienes autorización.

    Para obtener más información sobre cómo autorizar la organización mediante el flujo basado en JWT, consulta Autoriza una organización mediante el flujo basado en JWT en la documentación de Salesforce.

Envía los metadatos de Salesforce a una organización de scratch

  1. En Cloud Shell, ve al directorio del repositorio clonado mediante la ejecución del siguiente comando:

    cd salesforce-cloudfunc-integration
    
  2. Crea una organización de scratch a fin de probar el repositorio que clonaste para este instructivo.

    sfdx force:org:create \
        --setdefaultusername \
        --definitionfile salesforce/config/project-scratch-def.json \
        --targetdevhubusername ${SALESFORCE_USERNAME} \
        --setalias gcp-func-test-scratch-org
    

    Es una buena práctica usar una organización de scratch con este propósito, ya que proporciona un espacio seguro para probar paquetes nuevos y repositorios clonados.

  3. Ejecuta el siguiente comando para ir al subdirectorio salesforce:

    cd salesforce
    
  4. Envía los metadatos y el código a la organización de scratch:

    sfdx force:source:push
    
  5. Genera una URL para la organización de scratch:

    sfdx force:org:open
    
  6. Haz clic en la URL generada para ir a la organización de scratch en tu navegador.

Crea un archivo de almacén de claves JKS que contenga la clave P12 exportada

Los certificados de Salesforce y los pares de claves se usan para la comunicación SSL autenticada entre el servicio de Salesforce y los servidores y sitios web externos. El servicio de Salesforce debe almacenar de forma segura la clave P12 de la cuenta de servicio de Google Cloud generada que creaste antes en este instructivo. Las claves del servicio de Salesforce deben almacenarse en formato JKS (Java KeyStore).

  1. En Cloud Shell, agrega la clave P12 a un archivo de almacén de claves JKS llamado salesforce.jks en el directorio principal:

    keytool \
        -importkeystore \
        -srckeystore $HOME/external-service-invoker-sa.p12 \
        -destkeystore $HOME/salesforce.jks \
        -srcstoretype pkcs12 \
        -srcstorepass notasecret \
        -deststorepass notasecret \
        -deststoretype jks \
        -destalias google_cloud \
        -srcalias privatekey
    
  2. En Cloud Shell, haz clic en Más  y, luego, en Descargar archivo.

  3. En el cuadro Ruta de acceso al archivo completamente calificada, ingresa el siguiente nombre de archivo y haz clic en Descargar:

    salesforce.jks
    

    Así se descarga el almacén de claves que generaste en tu computadora local.

Importa el archivo JKS a tu organización de scratch de Salesforce

Ahora puedes completar los pasos para habilitar el proveedor de identidad de Salesforce.com y subir la clave JKS.

  1. Desde Setup (Configuración) en la organización de Salesforce, en el cuadro Quick Find (Búsqueda rápida), ingresa Identity y, luego, haz clic en Identity Provider (Proveedor de identidad) para navegar hasta la página de configuración de este proveedor.

    Navega a la página de configuración del proveedor de identidad en el panel de Salesforce

  2. Haz clic en Habilitar proveedor de identidad y, luego, en Guardar para aceptar el certificado.

  3. En Setup (Configuración), en el cuadro Quick Find (Búsqueda rápida), ingresa Certificate y, luego, selecciona Certificate and Key Management (Administración de claves y certificado).

    Navega a la página de certificación y administración de claves en el panel de Salesforce

  4. Haz clic en Importar desde el almacén de claves.

  5. Haz clic en Elegir archivo y selecciona el archivo JKS que descargaste antes.

  6. En el cuadro Contraseña del almacén de claves, ingresa notasecret.

  7. Haz clic en Guardar.

  8. Asegúrate de que la etiqueta del certificado se llame google_cloud. La etiqueta es importante, porque la clase Apex hace referencia al certificado que usa este nombre.

Crea registros de objetos de tipo de metadatos personalizados

Cuando se envía el repositorio mediante la CLI de Salesforce, se crea un objeto de tipo de metadatos personalizados. Debes propagar los detalles de ese objeto, por lo que tienes que crear un registro como se muestra en esta sección. Se hace referencia al registro en la clase Apex y se usa para asignar metadatos relevantes a la función de Cloud Functions a la que llamas desde el servicio de Salesforce.

  1. Desde Configuración en la organización de scratch de Salesforce, en el cuadro Búsqueda rápida, ingresa Custom metadata y, luego, selecciona Tipos de metadatos personalizados.

    Verás un tipo de metadatos personalizados llamado Clave de GCP.

  2. Junto a Clave de GCP, haz clic en Administrar registros.

  3. Haz clic en Nuevo para crear un nuevo registro y, luego, ingrese la siguiente información:

    1. Etiqueta. Ingresa GCP Function Invoker.
    2. Dirección de correo electrónico del cliente. Ingresa la dirección de la cuenta de servicio que creaste en el siguiente formato:

      function-invoker-sa@project-id.iam.gserviceaccount.com.

      Reemplaza project-id por el ID de tu proyecto de Cloud para este instructivo.

    3. Extremo de Function Audience. Ingresa la URL del extremo httpsTrigger de la función de Cloud Functions:

      https://us-central1-project-id.cloudfunctions.net/secureFunction
      
    4. Extremo del token. Ingresa https://www.googleapis.com/oauth2/v4/token.

      Configurar el extremo del token en el panel de Salesforce.

  4. Haz clic en Guardar.

Crea una configuración de sitio remoto en tu organización de scratch de Salesforce

Agrega una configuración de sitio remoto para hacer llamadas de Apex a la función de Cloud Functions de Google Cloud y a los extremos del token desde la organización de scratch de Salesforce.

  1. Desde Configuración en la organización de Salesforce, en el cuadro Búsqueda rápida, ingresa Remote y, luego, selecciona Configuración de sitio remoto.
  2. Haz clic en Nuevo sitio remoto.
  3. Para Nombre del sitio remoto, ingresa GCPCloudFunction.
  4. En URL del sitio remoto, ingresa el extremo httpsTrigger de la función de Cloud Functions:

    https://us-central1-project-id.cloudfunctions.net/secureFunction
    
  5. Haz clic en Guardar.

  6. Para crear otra configuración de sitio remoto, haz clic en Nuevo sitio remoto.

  7. Para Nombre del sitio remoto, ingresa GCPToken.

  8. En URL del sitio remoto, ingresa https://www.googleapis.com.

    Configurar el nombre del sitio remoto y la URL en el panel de Salesforce

  9. Haz clic en Guardar.

Prueba la función de Cloud Functions

Para probar esta función, debes ejecutar dos pruebas:

  • Activa el servicio de Salesforce para invocar la función de Cloud Functions mediante un token válido.
  • Invoca la función de Cloud Functions de Google Cloud sin token. De esta manera, se verifica que no se puede llamar a la función de Cloud Functions sin autenticación.

Invoca la función de Cloud Functions desde el servicio de Salesforce mediante un token de ID válido

  1. En la organización de Salesforce, haz clic en el ícono Selector de aplicaciones.

    Iniciar el Selector de aplicaciones en el panel de Salesforce

  2. En la barra de búsqueda, busca Accounts.

  3. En los resultados, haz clic en Cuentas.

  4. Haz clic en Nuevo para crear una cuenta nueva.

  5. Para Nombre, ingresa Probar cuenta.

  6. Haz clic en Guardar.

    Cuando se crea la cuenta, se activa la clase Apex, que invoca la función secureFunction de Cloud Functions.

Verifica que se invocó la función de Cloud Functions

Verifica que la función de Cloud Functions reciba el registro de forma correcta mediante la revisión de los registros de Cloud Logging.

  • En Cloud Shell, consulta los registros que generó la función secureFunction de Cloud Functions:

    gcloud functions logs read secureFunction
    

    Si se invocó la función de Cloud Functions, verás el nombre del cliente Test Account que creaste en el servicio de Salesforce en los registros.

Invoca la función de Cloud Functions sin token

Ahora puedes verificar que solo los usuarios autenticados y autorizados puedan acceder a la función de Cloud Functions.

  1. Realiza una solicitud no autenticada a la función de Cloud Functions:

    curl https://us-central1-${DEVSHELL_PROJECT_ID}.cloudfunctions.net/secureFunction
    

    La respuesta es un código de estado HTTP 403 Forbidden en la que se confirma que se denegó el acceso:

    <html><head>
    <meta http-equiv="content-type" content="text/html;charset=utf-8">
    <title>403 Forbidden</title>
    </head>
    <body text=#000000 bgcolor=#ffffff>
    <h1>Error: Forbidden</h1>
    <h2>Your client does not have permission to get URL <code>/secureFunction</code> from this server.</h2>
    <h2></h2>
    </body></html>
    

Realiza una limpieza

La manera más fácil de eliminar la facturación es borrar el proyecto que creaste para el instructivo.

Borra el proyecto

  1. En Cloud Console, ve a la página Administrar recursos.

    Ir a la página Administrar recursos

  2. En la lista de proyectos, selecciona el proyecto que deseas borrar y haz clic en Borrar .
  3. En el cuadro de diálogo, escribe el ID del proyecto y haz clic en Cerrar para borrar el proyecto.

Borra recursos de Salesforce

También debes borrar la organización de Salesforce Developer Edition y la organización de scratch asociada que creaste para este instructivo.

Desactiva tu organización de Developer Edition

  1. En la configuración de la organización de Salesforce (Dev Hub), en el cuadro Búsqueda rápida, ingresa Company y, luego, selecciona Company Information (Información de la empresa).
  2. Haz clic en Company Information (Información de la empresa).
  3. Haz clic en el botón Desactivar organización.

    El botón Desactivar organización que figura en la página de configuración de Salesforce

Borra la organización de scratch

  • En Cloud Shell, ejecuta el siguiente comando para borrar la organización de scratch de Salesforce:

    sfdx force:org:delete -u gcp-func-test-scratch-org
    

Próximos pasos