Solución:
ACTUALIZAR: Cambié la respuesta aceptada a la de @ AnanthMage2 ya que sigue las prácticas de codificación de Magento
Encontrada la solución, su controlador debe implementar CsrfAwareActionInterface y 2 de sus métodos:
use MagentoFrameworkAppCsrfAwareActionInterface;
use MagentoFrameworkAppRequestInterface;
use MagentoFrameworkAppRequestInvalidRequestException;
class MyController extends MagentoFrameworkAppActionAction implements CsrfAwareActionInterface
{
public function createCsrfValidationException(RequestInterface $request): ?InvalidRequestException
{
return null;
}
public function validateForCsrf(RequestInterface $request): ?bool
{
return true;
}
}
Esto resuelve el problema, pero también es incompatible con versiones anteriores, es decir, su módulo ahora no funcionará en Magento 2.2 y versiones anteriores. Para que sea compatible con versiones anteriores, se necesita algo como lo siguiente:
use MagentoFrameworkAppCsrfAwareActionInterface;
use MagentoFrameworkAppRequestInterface;
use MagentoFrameworkAppRequestInvalidRequestException;
if (interface_exists("MagentoFrameworkAppCsrfAwareActionInterface"))
include __DIR__ . "/MyController.m230.php";
else
include __DIR__ . "/MyController.m220.php";
Donde tendría la declaración de clase completa y correcta en cada uno de los dos archivos.
Verifique una solución más generosa que no cambie la funcionalidad principal, puede usar el complemento en Validar funcion de Magento Framework App Request CsrfValidator clase
Esta implementación no rompe la funcionalidad principal de las versiones de Magento 2.1 / 2.2 / 2.3.
di.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="MagentoFrameworkAppRequestCsrfValidator">
<plugin name="csrf_validator_skip" type="ModuleVendorPluginCsrfValidatorSkip" />
</type>
</config>
CsrfValidatorSkip.php
<?php
namespace ModuleVendorPlugin;
class CsrfValidatorSkip
{
/**
* @param MagentoFrameworkAppRequestCsrfValidator $subject
* @param Closure $proceed
* @param MagentoFrameworkAppRequestInterface $request
* @param MagentoFrameworkAppActionInterface $action
*/
public function aroundValidate(
$subject,
Closure $proceed,
$request,
$action
) {
if ($request->getModuleName() == 'Your_Module_frontName_Here') {
return; // Skip CSRF check
}
$proceed($request, $action); // Proceed Magento 2 core functionalities
}
}
Destaca mi página Gist en https://gist.github.com/ananth-iyer/59ecfabcbca73d6c2e3eeb986ed2f3c4 para animar.
Implementar CsrfAwareActionInterface es una solución, pero hace que el código no sea compatible con Magento <2.3
Aquí hay un truco (inyectar la clave a la solicitud en la acción) que es compatible con Magento 2.X
Ponlo en el constructor de Action.
// CsrfAwareAction Magento2.3 compatibility
if (interface_exists("MagentoFrameworkAppCsrfAwareActionInterface")) {
$request = $this->getRequest();
if ($request instanceof HttpRequest && $request->isPost() && empty($request->getParam('form_key'))) {
$formKey = $this->_objectManager->get(MagentoFrameworkDataFormFormKey::class);
$request->setParam('form_key', $formKey->getFormKey());
}
}