POST Request zu Controller über AJAX

Hi.

Ich versuche gerade einen eigenen Controller zu schreiben. Ich möchte das der Controller über einen AJAX call mit einem POST aufgerufen wird und komme nicht weiter.

Ich habe eine Methode mit @RouteScopes(storefront) und @Route("/xyz/test", name=“xyz.test”, methods={“POST”}) registriert.

Wenn ich in der Browser-Console manuell einen Request absende erhalte ich eine 403, der CSRF TOKEN wäre nicht valide.

Wie kann ich die Route korrekt aufrufen? Kann ich den CSRF Token manuell dranhängen? Oder sollte ich einen anderen Scope verwenden?

Ich bin mal tiefer in den Shopware Code eingestiegen (warum gibt es denn keine Doku für sowas? muss man sich immer alles aus den Fingern saugen?) und habe die sw_csrf Twig Funktion gefunden.
 

In einem .html.twig Template:

In unserem Javascript plugin:

import HttpClient from 'src/service/http-client.service';

...

client.post(                                                                                                                              
           '/xyz/test',                                                                                                                      
           JSON.stringify({ _csrf_token: this.el.getAttribute('data-xyz-token'), data: 'test'})                           
       );

Ich weiss nicht ob es wirklich so gedacht ist. Muss ich wirklich manuell den _csrf_token in den Request-Daten setzen? Gibt es da nichts Fertiges für sowas?

Hallo,

ja man gibt den CSRF-Token dem abzusehenden Formular mit, siehe Shopware Dokumentation: Shopware 6: Writing data . Beim JavaScript - POST - Request muss der Token dann aber nicht manuell mitgesendet werden, insofern man es sauber über ein Formular macht und beispielsweise FormSerializeUtil.serialize nutzt.

Grüße

Sebastian

Ich habe aber gar kein Formular.

Bzw. was heißt „sauber über ein Formular“, das sieht eher wie ein Workaround aus.

Hallo,

anhand deines POST - Requests bin ich davon ausgegangen, das du auch Daten verarbeiten möchtest. Und so etwas sollte man am besten über ein Formular - Element ( < form > ) tun, so wie es auch in der verlinkten Dokumentation steht. Und FormSerializeUtil.serialize wird dabei immer genutzt, wenn es um solche Dinge geht, siehe: platform/form-auto-submit.plugin.js at trunk · shopware/platform · GitHub . Ein “Workaround” ist dies also nicht.

Grüße

Sebastian

 

CSRF Check kann auf Server-Seite ausgeschaltet werden, siehe:

Bsp:


/**
 * @Route("/some-ajax-action", methods={"POST"}, defaults={"csrf_protected"=false, "XmlHttpRequest"=true})
 */