Niestandardowe formularze w sklepie przestały działać po aktualizacji Magento. Błąd „Invalid Form Key” w logach. Własne endpointy AJAX rzucały wyjątek CSRF przy każdym żądaniu. Czas naprawy: 2 godziny.
Objawy
- Formularze zwracają błąd „Invalid Form Key. Please refresh the page.”
- AJAX POST do własnych controllerów kończy się przekierowaniem lub 403
- Problem pojawił się po aktualizacji Magento do 2.4.x
- W logach:
Invalid Form Key. Please refresh the page
Rozwiązanie
<?php
// Opcja A: Implementuj CsrfAwareActionInterface
class MyController extends \Magento\Framework\App\Action\Action
implements \Magento\Framework\App\CsrfAwareActionInterface
{
public function createCsrfValidationException(
\Magento\Framework\App\RequestInterface $request
): ?\Magento\Framework\App\Request\InvalidRequestException {
return null; // nie rzucaj wyjątku, obsłuż sam
}
public function validateForCsrf(
\Magento\Framework\App\RequestInterface $request
): ?bool {
// Własna walidacja - np. API key w nagłówku
$apiKey = $request->getHeader('X-Api-Key');
return $apiKey === $this->config->getApiKey();
}
public function execute()
{
// Twoja logika
}
}
// Opcja B: Dodaj form_key do AJAX requestu
// W szablonie Magento:
// <input type="hidden" name="form_key" value="<?= $block->getFormKey() ?>"/>
// JavaScript - dodaj form_key do każdego AJAX POST
require(['jquery', 'mage/cookies'], function($) {
$(document).ajaxSend(function(event, xhr, settings) {
if (settings.type === 'POST') {
var formKey = $.mage.cookies.get('form_key');
if (formKey && settings.data) {
settings.data += '&form_key=' + formKey;
}
}
});
});
Wnioski
CSRF ochrona w Magento 2.4+ jest domyślnie włączona dla wszystkich controllerów. Własne endpointy wymagają albo dołączenia form_key do żądania albo implementacji CsrfAwareActionInterface z własną logiką walidacji (np. API key, JWT token).
