Недопустимый токен CSRF, если не используется HTTPS

#http #authentication #https #symfony5 #php-7.4

Вопрос:

Я провожу некоторые тесты с Symfony 5.4.x@dev в рамках подготовки к новому проекту.

Я создал форму входа с помощью symfony console make:auth и внес несколько изменений, чтобы исправить несколько устаревших способов использования и добавить Remember Me опцию.

Вот мой Authenticator класс:

 class AppAuthenticator extends AbstractLoginFormAuthenticator
{
    use TargetPathTrait;

    public const LOGIN_ROUTE = 'app_login';

    private UrlGeneratorInterface $urlGenerator;

    public function __construct(UrlGeneratorInterface $urlGenerator)
    {
        $this->urlGenerator = $urlGenerator;
    }

    public function authenticate(Request $request): Passport
    {
        $email = $request->request->get('email', '');

        $request->getSession()->set(Security::LAST_USERNAME, $email);

        return new Passport(
            new UserBadge($email),
            new PasswordCredentials($request->request->get('password', '')),
            [
                new CsrfTokenBadge('authenticate', $request->get('_csrf_token')),
                new RememberMeBadge(),
            ]
        );
    }

    public function onAuthenticationSuccess(Request $request, TokenInterface $token, string $firewallName): ?Response
    {
        if ($targetPath = $this->getTargetPath($request->getSession(), $firewallName)) {
            return new RedirectResponse($targetPath);
        }

        // For example:
        return new RedirectResponse($this->urlGenerator->generate('app_home'));
        //throw new Exception('TODO: provide a valid redirect inside '.__FILE__);
    }

    protected function getLoginUrl(Request $request): string
    {
        return $this->urlGenerator->generate(self::LOGIN_ROUTE);
    }
}
 

Если я тестирую его по протоколу HTTPS (самозаверяющий сертификат), он работает должным образом, однако, если я тестирую его по протоколу HTTP (без сертификата), вход в систему завершается ошибкой. Глядя на профилировщик, я вижу, что был сгенерирован токен csrf, который отправляется вместе с электронной почтой и паролем, однако он не проходит проверку

Параметры ПОСТА:

 _csrf_token: "870b3a5cfaf2bc0cf7cd2c75b5617.XKmjc7RWqjAgRmVbGaUNZ3FLJFSVhp1EjZZi_06oi8o.G5_PNvEi5XhTNVIrS_xJFkkEfnmtwMcMxaMxrjvS8oUS4ZIJxBXDXHcyXQ"
_remember_me : "on"
email: "me@domain.tld"
password :"mypassword"
 

Ответ аутентификатора:

 Authenticator failed.

[▼
  "exception" => SymfonyComponentSecurityCoreExceptionInvalidCsrfTokenException {#344 ▼
    -token: null
    #message: "Invalid CSRF token."
    #code: 0
    #file: "/home/luis/Desktop/modularcms/vendor/symfony/security-http/EventListener/CsrfProtectionListener.php"
    #line: 51
  "authenticator" => "AppSecurityAppAuthenticator"
]
 

Почему аутентификатор работает под HTTPS , но не работает под HTTP ?

Комментарии:

1. Я только что обновился до Symfony 5.4, и мой WebTestCase не справляется с этим сообщением. Вы нашли решение?