Parâmetros Adicionais
O sistema suporta nonce (para mitigar ataques de Replay) e state (para manter o estado e mitigar CSRF).
nonce
String sensível a maiúsculas usada para associar uma sessão do cliente a um id_token e para mitigar ataques do tipo Replay. O valor é transmitido inalterado da solicitação de autenticação para o id_token. Se estiver presente no id_token, o cliente deve verificar se o valor da Claim nonce é igual ao valor do parâmetro nonce enviado na solicitação.
Exemplo
Nonce na requisição:
&nonce=n-0S6_WzA2MjNo ID Token:
{
"nonce": "n-0S6_WzA2Mj",
...
}Validação
const nonceGerado = gerarNonce();
sessionStorage.setItem('oauth_nonce', nonceGerado);
const authUrl = `...&nonce=${nonceGerado}`;
// No callback, após receber o ID Token:
const claims = decodificarJWT(idToken);
const nonceArmazenado = sessionStorage.getItem('oauth_nonce');
if (claims.nonce !== nonceArmazenado) {
throw new Error('Nonce não corresponde - possível ataque Replay');
}state
Valor opaco usado para manter o estado entre a requisição e a Callback. Comumente a mitigação de Cross-site Request Forgery (CSRF, XSRF) é feita a partir da vinculação entre o valor desse parâmetro a um cookie de Browser. Caso esteja presente na requisição de autorização, o valor informado é transmitido inalterado para a Callback.
Exemplo
State na requisição:
&state=af0ifjsldkjNa callback:
https://exemplo.com.br/callback?code=50b9-ac5e-43-a9b6f8685&state=af0ifjsldkjValidação
const stateGerado = gerarState();
sessionStorage.setItem('oauth_state', stateGerado);
const authUrl = `...&state=${stateGerado}`;
// No callback:
const urlParams = new URLSearchParams(window.location.search);
const stateRetornado = urlParams.get('state');
const stateArmazenado = sessionStorage.getItem('oauth_state');
if (stateRetornado !== stateArmazenado) {
throw new Error('State não corresponde - possível ataque CSRF');
}Funções Auxiliares
function gerarNonce() {
return btoa(Math.random().toString()).substring(0, 16);
}
function gerarState() {
return btoa(Math.random().toString()).substring(0, 16);
}Boas Práticas
- Sempre use
statepara prevenir ataques CSRF - Use
noncequando precisar garantir que o ID Token corresponde à solicitação específica - Armazene os valores de forma segura (sessionStorage, cookies httpOnly, etc.)
- Valide sempre os valores retornados antes de processar a autenticação
- Gere valores aleatórios e únicos para cada solicitação
