> For the complete documentation index, see [llms.txt](https://docs.globalbridgeconnections.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.globalbridgeconnections.com/seguridad/solicitudes-firmadas.md).

# Solicitudes Firmadas

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:

| Campo               | Tipo de dato | Detalle                                                                                                                                                                                      |
| ------------------- | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| authorization-token | string       | <p>Token que se genera genera luego del Login, se debe enviar con el siguiente formato:</p><p>"Bearer JHgytHG67687JHG..."</p>                                                                |
| 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:&#x20;

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));
}
```
