> ## Documentation Index
> Fetch the complete documentation index at: https://translations.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> Aprenda a generar y validar de forma segura un nonce criptográfico para usarlo con el flujo implícito con Form Post.

# Mitigue los ataques de repetición al usar el Flujo implícito

Para mitigar los ataques de repetición al usar el [flujo implícito con Form Post](/es/docs/get-started/authentication-and-authorization-flow/implicit-flow-with-form-post), se debe enviar un <Tooltip tip="Nonce: Número arbitrario emitido una sola vez en un protocolo de autenticación para detectar y prevenir ataques de repetición." cta="Ver glosario" href="/es/docs/glossary?term=nonce">nonce</Tooltip> en las solicitudes de autenticación, [tal como exige la especificación OpenID Connect (OIDC)](https://openid.net/specs/openid-connect-core-1_0.html#ImplicitAuthRequest).

La aplicación genera el nonce, lo envía como parámetro `nonce` en la cadena de consulta de la solicitud de autenticación, y Auth0 lo incluye en la respuesta del <Tooltip tip="ID Token: Credencial destinada al propio cliente, en lugar de usarse para acceder a un recurso." cta="Ver glosario" href="/es/docs/glossary?term=ID+Token">ID Token</Tooltip>. Esto permite que las aplicaciones asocien la respuesta del ID Token de Auth0 con la solicitud de autenticación inicial.

Para obtener más información sobre dónde incluir el nonce, consulte [Agregar Login con el flujo implícito con Form Post](/es/docs/get-started/authentication-and-authorization-flow/implicit-flow-with-form-post/add-login-using-the-implicit-flow-with-form-post).

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  [Auth0.js](/es/docs/libraries/auth0js) gestiona los parámetros `state` y `nonce` por usted cuando utiliza [autenticación entre orígenes](/es/docs/authenticate/login/cross-origin-authentication).
</Callout>

<div id="generate-a-cryptographically-random-nonce">
  ## Genera un nonce criptográficamente aleatorio
</div>

Una forma de generar un nonce criptográficamente aleatorio es usar una herramienta como [Nano ID](https://github.com/ai/nanoid) o similar. Sin embargo, esto requiere empaquetar la herramienta con tu código JavaScript. Si eso no es posible, puedes aprovechar que los [navegadores modernos](http://caniuse.com/#feat=cryptography) pueden usar la [Web Crypto API](https://www.w3.org/TR/WebCryptoAPI/) para generar cadenas aleatorias criptográficamente seguras que pueden usarse como nonces.

```javascript lines theme={null}
function randomString(length) {
    var charset = '0123456789ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvwxyz+/'
    result = ''

    while (length > 0) {
        var bytes = new Uint8Array(16);
        var random = window.crypto.getRandomValues(bytes);

        random.forEach(function(c) {
            if (length == 0) {
                return;
            }
            if (c < charset.length) {
                result += charset[c];
                length--;
            }
        });
    }
    return result;
}
```

<div id="persist-nonces-across-requests">
  ## Mantenga los nonce entre solicitudes
</div>

El nonce generado debe conservarse en su aplicación web mediante cualquiera de los siguientes métodos:

* `HttpOnly` <Tooltip tip="Cookie de sesión: Entidad que, cuando está presente, permite considerar autenticado al usuario." cta="Ver glosario" href="/es/docs/glossary?term=session+cookie">cookie de sesión</Tooltip>
* valor de almacenamiento local de HTML5

Por ejemplo:

```js lines theme={null}
window.localStorage.setItem('nonce', randomString(16));
```

<div id="validate-id-token">
  ## Validar el token de ID
</div>

Una vez que Auth0 responde con un [ID Token](/es/docs/secure/tokens/id-tokens), este token debe [validarse y decodificarse](/es/docs/secure/tokens/id-tokens/validate-id-tokens) como de costumbre.
Su claim `nonce` debe contener exactamente el mismo valor que se envió en la solicitud.
De lo contrario, la aplicación debe rechazar la authentication.

```javascript lines theme={null}
var jwt = '...'; // cuerpo del ID Token validado y decodificado
if (jwt.nonce === window.localStorage.getItem('nonce')) {
    // Nonce correcto
} else {
    // ¡Nonce incorrecto! Podría estar en curso un ataque de repetición de token
}
```

<div id="learn-more">
  ## Más información
</div>

* [Flujo implícito con Form Post](/es/docs/get-started/authentication-and-authorization-flow/implicit-flow-with-form-post)
* [Agregar Login con el flujo implícito con Form Post](/es/docs/get-started/authentication-and-authorization-flow/implicit-flow-with-form-post/add-login-using-the-implicit-flow-with-form-post)
* [Flujo implícito con OIDC](/es/docs/authenticate/login/oidc-conformant-authentication/oidc-adoption-implicit-flow)
