# Autenticación y configuración

> Da al cliente del SDK un token de API, la dirección de la API y la organización, desde el entorno o desde el constructor.

El cliente necesita tres cosas. Cada una sale del constructor o, si no la indicas, de una variable de entorno.

| Ajuste | Opción de TypeScript | Argumento de Python | Entorno | Por defecto |
|---|---|---|---|---|
| Token de API | `token` | `token=` | `OPENWAF_TOKEN` | ninguno: las llamadas fallan con `no_token` |
| Dirección de la API | `baseUrl` | `base_url=` | `OPENWAF_API_URL` | una dirección integrada que no sirve la API: defínela siempre |
| Id de la organización | `org` | `org=` | `OPENWAF_ORG` | la organización del token, que se pide una vez con `GET /v1/orgs` |

Pon como dirección de la API `https://dash.openwaf.dev`; el SDK añade las rutas `/v1/…`.

**TypeScript**

```ts
import { OpenWAF } from "./openwaf.ts";

// Desde el entorno: OPENWAF_API_URL, OPENWAF_TOKEN, OPENWAF_ORG.
const owf = new OpenWAF();

// O explícitamente, por ejemplo en una extensión de navegador o un worker sin process.env.
const other = new OpenWAF({ baseUrl: "https://dash.openwaf.dev", token: myToken });
```
El cliente de TypeScript lee el entorno en Node.js, Bun y Deno. En los demás casos, pasa las opciones. También puedes pasar tu propia implementación de `fetch` en `fetch`.
**Python**

```py
from openwaf import OpenWAF

# Desde el entorno: OPENWAF_API_URL, OPENWAF_TOKEN, OPENWAF_ORG.
owf = OpenWAF()

# O explícitamente, con un plazo mayor (segundos, 60 por defecto).
other = OpenWAF(base_url="https://dash.openwaf.dev", token=my_token, timeout=120)
```


## El token

Crea los tokens en el panel, en **Tokens de API**. Un token tiene un rol (**Solo lectura**, **Técnico**, **Admin**) y un alcance (toda la organización, un cliente o una zona); la API aplica los dos en cada llamada, uses el método del SDK que uses. Da a cada script el token más restringido que le sirva y guárdalo en un almacén de secretos o en una variable de entorno, nunca en el código.

El cliente lo envía como `Authorization: Bearer owf_…` en todas las llamadas salvo las públicas (las CA de TLS hacia el origen).

## La organización

Todos los métodos bajo `/v1/orgs/{org}` reciben un `org` opcional. Sin él, el cliente usa la suya: el `org` que configuraste o la organización del token, que pide a la API una vez y recuerda. `orgId()` (TypeScript) u `org_id()` (Python) la devuelven.

## Las zonas se nombran por id

Los métodos de zona reciben el **id** de la zona, no su dominio. Búscalo una vez con `listZones` / `list_zones`:

**TypeScript**

```ts
const { items = [] } = await owf.listZones();
const zone = items.find((z) => z.name === "example.com");
```
**Python**

```py
zone = next(z for z in owf.list_zones()["items"] if z["name"] == "example.com")
```
