Solicitudes Firmadas

Información relacionada con la forma de comunicación segura en la API

En GBC, hemos implementado una capa de seguridad de peticiones a nuestros endpoints públicos y privados, la cual consiste en generar una firma única por cada petición enviada a los ambientes de GBC. A continuación encontrarás el paso a paso para lograr firmar tus solicitudes a nuestras API.

Headers

En las cabeceras de cada petición, GBC solicitará los siguientes parámetros obligatorios:

CampoTipo de datoDetalle

authorization-token

string

Token que se genera genera luego del Login, se debe enviar con el siguiente formato:

"Bearer JHgytHG67687JHG..."

signature

string

Firma generada con los valores del payload y encriptada con la secret key del cliente B2B. Este resultado (firma) se envía en los headers de cada petición junto con el authorization-token.

Generación del signature (firma)

A continuación, los pasos para la generación de la firma:

  1. Tener api-public-key y api-secret-key.

  2. Agregar el campo generado en el momento timestamp a los datos (objeto) a firmar.

  3. Ordenar los campos (objeto) que se quieren firmar de forma alfabética ascendente.

  4. Pasar el objeto a tipo texto.

  5. Ejecutar la función SHA256, donde la llave de la firma seria con el valor de la (api-secret-key)

  6. El dato resultante de este cálculo sería lo que colocaría en el campo signature en los Headers

Ejemplo del cálculo de firma (Nodejs)

Objeto a firmar

const params = {
        alias,
        timestamp,
}

Función de firma

// Liberias Crypto
const CryptoJS = require("crypto-js");
const queryString = require('query-string');
const axios = require('axios');

// Claves secretas
const SECRET_KEY = 'tu-secret-key-uuid';
const PUBLIC_KEY = 'tu-public-key-uuid';
const URL = 'https://stgapicards.gbc.pe/api-hub/v1/merchants/me';

// Función de firma de datos
const signatureRequest = (params, secretKey) => {
    params = Object.keys(params)
        .sort()
        .reduce((acc, key) => {
            acc[key] = params[key];
            return acc;
        }, {});
    const query = queryString.stringify(params);
    return CryptoJS.SHA256(query, { secretKey }).toString();
}

// Ejecución de la firma en una función de ejemplo

const getUserData = (alias) =>
{
    const timestamp = Math.floor(Date.now());

    const params = {
        alias,
        timestamp,
    }

     const signatureResponse = signatureRequest(params, SECRET_KEY);
    
     axios.post(URL, params, {
        headers: {
            'Api-Public-Key': PUBLIC_KEY,
            'Signature': signatureResponse
        }
     })
     .then( (response) => console.log('RESPONSE:::', response.data ))
     .catch( (error) => console.log('ERROR:::', error.response.data));
}

Last updated