# Limita los intentos fallidos con BLOCKED

> Cuenta los intentos por dirección IP con BLOCKED() y responde 429 al alcanzar el límite, para logins y restablecimientos de contraseña.

Framework: total5
Product: Total.js 5 (total5@0.0.19)
Language: es
Content-SHA256: a21d7733e7aaed0b05ad31bb5f74ef1db02c5502becb72f3440bba671b4530fb
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: total5-installed@total5@0.0.19
Review: not-recorded

`BLOCKED($, limit, expiration)` cuenta las llamadas por dirección IP. Devuelve `true` cuando la dirección ha hecho más de `limit` llamadas dentro de la caducidad (por defecto: 5 llamadas en 15 minutos), y `undefined` antes de eso. Llámalo al principio de un manejador sensible y detente cuando devuelva `true`. Para perdonar a una dirección tras un login correcto llama a `BLOCKED($, -1)`.

Los contadores viven en la memoria del proceso; detrás de un proxy inverso asegúrate de que la dirección real del cliente llegue a Total.js, o todos compartirán un único contador.

```js controllers/login.js
exports.install = function() {
	ROUTE('POST /login/', login);
};

function login($) {

	if (BLOCKED($, 3, '1 minute')) {
		$.invalid(429);
		return;
	}

	if ($.body.password === 'correct') {
		BLOCKED($, -1);
		$.json({ ok: true });
	} else
		$.invalid(401);
}
```
