1
resposta

Invalid CSRF Token

Estou utilizando para fazer o login e logout o spring starter security, Fiz todas as configurações, porém quando tento fazer login ele me da um erro de Token inválido. Quando fiz o curso do spring mvc utilizando jsp, vi que basta utilizar a taglib form nos formulários EX: que resolveria o problema, porém como faço no jsf?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://primefaces.org/ui">

<h:head></h:head>
<body>


    <h:form id="frmContas">
        <p:fieldset legend="Login">
            <h:panelGrid columns="2">

Email:             <h:inputText value="#{loginController.email}">
                    </h:inputText>
Senha:             <h:inputSecret value="#{loginController.senha}" /> 
                <h:commandButton action="#{loginController.logar}" value="Acessar" > 
                </h:commandButton>
                </h:panelGrid>
        </p:fieldset>
        <input type="hidden"  name="${_csrf.parameterName}"   value="${_csrf.token}"/>


</h:form>


</body>
</html>
1 resposta

Olá Felipe, blz?

O JSF já tem uma "prevenção" para o tipo de ataque CSRF. Pois o JSF, já coloca os id's("tokens") dos elementos no formulário, e os mesmos devem coincidir com um elemento da arvore de componentes.

Sabendo disso uma das alternativas é desabilitar o CSFR quando se trabalha com JSF.

Uma segunda alternativa seria tentar colocar o token de csrf direto nas suas páginas manualmente. Vou ser sincero que nunca cheguei a fazer o teste dessa abordagem com JSF.

Mas em uma jsp caso você não esteja usando as taglibs do spring. Você pode adicionar um input hidden com os tokens que o spring disponibiliza na request.

<input type="hidden"
    name="${_csrf.parameterName}"
    value="${_csrf.token}"/>

Caso essa abordagem não funcione, seria preciso a cada request você pedir os tokens para o spring e disponibilizar.

Talvez valha a pena dar uma consultada na documentação de csrf no spring. => https://docs.spring.io/spring-security/site/docs/current/reference/html/csrf.html

Espero ter ajudado, e bons estudos.