Saltar al contenido

La actualización de Magento 2.3 rompe las solicitudes HTTP POST en el punto final del módulo personalizado

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());
            }
        }
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *