Форма с носителем, получающим ОШИБКУ: токен CSRF недействителен.Пожалуйста, попробуйте повторно отправить форму - PullRequest
0 голосов
/ 29 мая 2019

У меня есть много форм на моем сайте, и все они работают с защитой CSRF. У меня есть форма со средствами массовой информации, которая отображается через компонент Symfony Form, и я получаю поле токена в ветке и получаю его значение также в контроллере, но каждый раз, когда я отправляю форму, я получаю только эту ошибку

ОШИБКА: токен CSRF недействителен. Пожалуйста, попробуйте повторно отправить форму.

Я знаю, что многие задавали этот вопрос раньше, но я не получил решения ни от кого из них. Я попытался, добавив поле токена вручную, и попытался проверить его, как указано здесь . не сработал и этот.

Вот моя веточка:

{{ form_start(jobApplicationForm, {'attr': {'id': 'jobApplication','class':'', 'method': 'post','enctype':'multipart/form-data' }}) }}
        <div id="job_application_first_name_validate"></div>
        {{ form_widget(jobApplicationForm.first_name, {'value' : linkedinUserFirstName}) }}
        <div id="job_application_last_name_validate"></div>
        {{ form_widget(jobApplicationForm.last_name, {'value' : linkedinUserLastName}) }}
        <div id="job_application_email_address_validate"></div>
        {{ form_widget(jobApplicationForm.email_address, {'value' : linkedinUserEmail}) }}
        <div id="job_application_resume_binaryContent_validate"></div>
        <div id="job_application_cover_letter_binaryContent_validate"></div>
        <div class="options clear">

            <label for="job_application_cover_letter_binaryContent"><a
                        class="icon_paperclip letter">Include a cover letter</a></label>

            {{ form_widget(jobApplicationForm.cover_letter) }}
            {{ form_widget(jobApplicationForm.job_id) }}
            <label for="job_application_resume_binaryContent"><a class="icon_paperclip resume">Attach
                    your resume</a></label>
            {{ form_widget(jobApplicationForm.resume) }}
        </div>

        <div class="attachments clear list">
        </div>
        {#                      <input type="hidden" name="token" value="{{ csrf_token('_jobApplication_token') }}"/>#}
        <div id="hiddenRecaptcha_validate"></div>
        <div class="captcha g-recaptcha" data-sitekey="{{ GOOGLE_CAPTCHA_SITEKEY }}"></div>
        <input type="hidden" class="hiddenRecaptcha required" name="hiddenRecaptcha"
               id="hiddenRecaptcha"/>
        <div class="center">
            <button type="submit" class="btn btnGreen btnSubmit"><span>Apply</span></button>
        </div>
        {{ form_rest(jobApplicationForm) }}                          
 {{ form_end(jobApplicationForm) }}

Вот мой JS:

$('#jobApplication').on('submit', function (e) {
    e.preventDefault();
    if ($('#job_application_resume_binaryContent').val() != "") {
        if ($(this).valid()) {
            var $form = $(e.target),
                form = $('#jobApplication'),
                formId = '#' + $form[0].id;
            var holder = $(this).closest('.formHolder');
            holder.removeAttr('style').removeClass('act').css('overflow', 'hidden').addClass('act');
            var formData = new FormData(form[0]);
            holder.find('.form').delay(400).fadeOut(400, function () {
                holder.find('.loading').fadeIn(400);
                $.ajax({
                    type: 'post',
                    url: $form.attr('action'),
                    data: formData,
                    enctype: 'multipart/form-data',
                    processData: false,  // Important!
                    contentType: false,
                    cache: false,
                    dataType: 'JSON',
                    success: function (res) {
                        if (res.status === true) {
                            $('.thanks').show();
                        } else {
                            grecaptcha.reset();
                        }
                    }
                });
            });
        }
    } else {
        $('.options .resume').css({
            'color': '#FF484D',
            'font-weight': 'bold'
        });
    }
});

Мой контроллер:

if ($form->isValid()) {
    //                    if ($this->isCsrfTokenValid('_jobApplication_token', 
      $submittedToken)) {
        $resume = $form->get('resume')->getData();
        $cover_letter = $form->get('cover_letter')->getData();
        $attachments = null;
        $provider = $this->getContainer()->get('sonata.media.provider.file');

        if (!empty($resume)) {
            $attachments[0]['fileName'] = $resume->getName();
            $attachments[0]['mimeType'] = $resume->getBinaryContent()->getMimeType();
            $attachments[0]['filePath'] = $_SERVER['DOCUMENT_ROOT'] . $provider->generatePublicUrl($resume, 'reference');

        }
        if (!empty($cover_letter)) {
            $attachments[1]['fileName'] = $cover_letter->getName();
            $attachments[1]['mimeType'] = $cover_letter->getBinaryContent()->getMimeType();
            $attachments[1]['filePath'] = $_SERVER['DOCUMENT_ROOT'] . $provider->generatePublicUrl($resume, 'reference');

        }
        $data = $form->getData();
        // ... perform some action, such as saving the task to the database
        // for example, if Task is a Doctrine entity, save it!
        $entityManager = $this->getDoctrine()->getManager();
        $data->setCreatedAt(new \DateTime('now'));
        $data->setUpdatedAt(new \DateTime('now'));
        $data->setSite($this->getSiteByLocale());
        $entityManager->persist($data);
        $entityManager->flush();
        $fields = [
            [
                'id' => '360014538174',
                'value' => $data->getFirstName()
            ],
            [
                'id' => '360014499253',
                'value' => $data->getLastName()
            ],
            [
                'id' => '360014289413',
                'value' => $data->getEmailAddress()
            ]
        ];
        $result = $this->CreateTicketOnZendesk('Career Inquiry', 'Career form inquiry', '360000622393', $fields, $attachments, $data->getEmailAddress());
        $result = $this->CreateUserOnZendesk($data->getFirstName() . ' ' . $data->getLastName(), $data->getEmailAddress(), 'Careers');
        $emailResponse = $this->sendEmail2User($this->fromEmail, $data->getEmailAddress(), 'Careers', $data, $baseurl);
        $success = true;

        //          $redirect_url = $this->generateUrl("cms_help_center", array(), true);
        return new JsonResponse(array('status' => $success));
        } 
        else {
        die($form->getErrors());
        return new JsonResponse(array('status' => false, 'message' => !empty($message) ? $message : 'Something went wrong'));
}

Я застрял в этом выпуске.

...