# API de metadados

As functions no Firewall têm acesso a um conjunto de metadados que podem ser manipulados para:

- Filtrar e gerenciar o acesso a sua aplicação.
- Aplicar lógicas específicas para diferentes cenários.

Esta documentação de referência descreve os metadados disponíveis e como acessá-los.

---

## GeoIP

Os dados de `GeoIP` são sobre a localização geográfica do cliente com base em dados de IP.

| Nome | Descrição |
| - | - |
| geoip_asn | Número de Sistema Autônomo (ASN na sigla em inglês) |
| geoip_city | Cidade |
| geoip_city_continent_code | Código da cidade |
| geoip_city_country_code | Código de cidade e país |
| geoip_city_country_name | Nome de cidade e país |
| geoip_continent_code | Código do continente |
| geoip_country_code | Código do país |
| geoip_country_name | Nome do país|
| geoip_region | Região |
| geoip_region_name | Nome da região |

---

## Remote

Os dados de `Remote` fornecem detalhes sobre o endereço IP e a porta TCP.

| Nome | Descrição |
|----------------------------------|----------------------------------------------------------------|
|  remote_addr                     | Endereço de IP do remote (client)                                   |
|  remote_port                     | Porta TCP do remote (client)                                      |
|  remote_user                     | Usuário informado na URL. Exemplo: usuário em http://user@site.com/ |


---

## Server

Os dados de `server` retornam detalhes sobre o protocolo sendo utilizado na requisição.

| Nome | Descrição |
|----------------------------------|----------------------------------------------------------------|
| server_protocol      | Protocolo sendo utilizado na requisição. Exemplo: HTTP/1.1 |

---

## TLS

Os dados de `TLS` estão disponíveis quando a requisição é feita através de uma conexão TLS segura.

| Nome | Descrição |
|----------------------------------|----------------------------------------------------------------|
| ssl_cipher | Cifra TLS usada |
| ssl_protocol | Protocolo TLS usado |

---

## Fingerprints do Servidor

Os metadados de Impressões Digitais do Servidor fornecem informações de fingerprinting TLS para análise de segurança aprimorada.

| Nome | Descrição |
|----------------------------------|----------------------------------------------------------------|
| server_fingerprint | Fingerprint TLS do servidor |
| server_fingerprint_ja4h | Fingerprint JA4H do servidor |

---

## Identificadores

| Identificador         | Descrição                                                                                                                    |
|-----------------------|-----------------------------------------------------------------------------------------------------------------------------|
| solution_id           | Identificador interno da Solução (conjunto de produtos) que processa a requisição.                                          |
| client_id             | Identificador da conta Azion (cliente) proprietária do workload.                                                            |
| function_id           | Identificador da instância da Function executada para esta requisição.                                                  |
| configuration_id      | Identificador da configuração da Function (versão / revisão) aplicada.                                                 |
| virtualhost_id        | Identificador do Virtual Host (domínio da Applications) que recebeu a requisição.                                       |
| edge_connector_id     | Identificador do Connector utilizado quando a requisição é roteada por um conector. Um traço (-) é retornado se não houver. |
| request_id            | ID globalmente único automaticamente atribuído a cada requisição; útil para rastreamento ponta a ponta.                     |

---
## Uso

Você pode acessar os metadados através de `event.request.metadata []`, por exemplo:

```js
    let ip = event.request.metadata["remote_addr"] // Acessando o remote address da requisição
```

### Implementação

No exemplo de código abaixo:

- O endereço remoto é acessado.
- É verificado se este endereço está listado em uma network list.
- Se estiver na lista, a solicitação será negada.

```js
     addEventListener("firewall", (event) => {

      let ip = event.request.metadata["remote_addr"] 

      try {
        let found = Azion.networkList.contains(String(networkListId), ip); 
        if (found) {
          event.deny();
        }
      } catch (err) {
        event.console.error(`Error: `, err.stack);
      }
    });
```





---