#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 не справляется с этим сообщением. Вы нашли решение?