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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.globalbridgeconnections.com/seguridad/solicitudes-firmadas.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
