Parámetros Adicionales
El sistema soporta nonce (para mitigar ataques de Replay) y state (para mantener el estado y mitigar CSRF).
nonce
Cadena sensible a mayúsculas usada para asociar una sesión del cliente a un id_token y para mitigar ataques del tipo Replay. El valor es transmitido inalterado de la solicitud de autenticación al id_token. Si está presente en el id_token, el cliente debe verificar si el valor de la Claim nonce es igual al valor del parámetro nonce enviado en la solicitud.
Ejemplo
Nonce en la solicitud:
&nonce=n-0S6_WzA2MjEn el ID Token:
{
"nonce": "n-0S6_WzA2Mj",
...
}Validación
const nonceGenerado = generarNonce();
sessionStorage.setItem('oauth_nonce', nonceGenerado);
const authUrl = `...&nonce=${nonceGenerado}`;
// En el callback, después de recibir el ID Token:
const claims = decodificarJWT(idToken);
const nonceAlmacenado = sessionStorage.getItem('oauth_nonce');
if (claims.nonce !== nonceAlmacenado) {
throw new Error('Nonce no corresponde - posible ataque Replay');
}state
Valor opaco usado para mantener el estado entre la solicitud y el Callback. Comúnmente la mitigación de Cross-site Request Forgery (CSRF, XSRF) se hace a partir de la vinculación entre el valor de este parámetro a una cookie del Navegador. Si está presente en la solicitud de autorización, el valor informado es transmitido inalterado al Callback.
Ejemplo
State en la solicitud:
&state=af0ifjsldkjEn el callback:
https://ejemplo.com.br/callback?code=50b9-ac5e-43-a9b6f8685&state=af0ifjsldkjValidación
const stateGenerado = generarState();
sessionStorage.setItem('oauth_state', stateGenerado);
const authUrl = `...&state=${stateGenerado}`;
// En el callback:
const urlParams = new URLSearchParams(window.location.search);
const stateRetornado = urlParams.get('state');
const stateAlmacenado = sessionStorage.getItem('oauth_state');
if (stateRetornado !== stateAlmacenado) {
throw new Error('State no corresponde - posible ataque CSRF');
}Funciones Auxiliares
function generarNonce() {
return btoa(Math.random().toString()).substring(0, 16);
}
function generarState() {
return btoa(Math.random().toString()).substring(0, 16);
}Buenas Prácticas
- Siempre use
statepara prevenir ataques CSRF - Use
noncecuando necesite garantizar que el ID Token corresponde a la solicitud específica - Almacene los valores de forma segura (sessionStorage, cookies httpOnly, etc.)
- Valide siempre los valores retornados antes de procesar la autenticación
- Genere valores aleatorios y únicos para cada solicitud
