Неверный токен CSRF при сбросе пароля - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть функция сброса пароля на моем сайте, однако форма не работает.При попытке установить пароль отображается «Неверный токен CSRF».

Это моя действительная форма пароля для сброса:

<div class="login-form">
            <form name="fos_user_resetting_form" method="post" action="{{ path('fos_user_resetting_reset', {'token': token}) }}" class="needs-validation" novalidate>
                <div class="form-group">
                    <label for="fos_user_resetting_form_plainPassword_first" class="required">{{ 'form.password'|trans }}</label>
                    <div class="input-group">
                        <div class="input-group-addon"><i class="fa fa-key"></i></div>
                        <input type="password" class="form-control" id="fos_user_resetting_form_plainPassword_first" name="fos_user_resetting_form[plainPassword][first]" required="required" autocomplete="new-password" />
                        <div class="invalid-tooltip">Por favor, ingrese la nueva contraseña.</div>
                    </div>
                </div>
                <div class="form-group"> 
                    <label for="fos_user_resetting_form_plainPassword_second" class="required">{{ 'form.password_confirmation'|trans }}</label>
                    <div class="input-group">
                        <div class="input-group-addon"><i class="fa fa-key"></i></div>
                        <input type="password" class="form-control" id="fos_user_resetting_form_plainPassword_second" name="fos_user_resetting_form[plainPassword][second]" required="required" autocomplete="new-password" />
                        <div class="invalid-tooltip" id="confirm_password_error">Por favor, ingrese la nueva contraseña.</div>
                    </div>
                </div>
                <div>
                    <button type="submit" id="_submit" name="_submit" class="btn btn-success btn-flat m-b-30 m-t-30">{{ 'resetting.reset.submit'|trans }}</button>
                </div>
            </form>
        </div>

Я знаю, что мне нужно добавить скрытый ввод _csrf_token в форму, но как?

Я пробовал с

            {% if csrf_token %}
                <input type="hidden" name="_csrf_token" value="{{ csrf_token }}" />
            {% endif %}

С:

            {% if _token %}
                <input type="hidden" name="_csrf_token" value="{{ _token }}" />
            {% endif %}

С:

<input type="hidden" id="fos_user_resetting_form__token" name="fos_user_resetting_form[_token]" value="{{ _token }}" />

И другими попытками ..но никто не работает.Во всех случаях ошибка ветки показывается как «Переменная« _token »не существует».

При использовании панели отладки Symfony я вижу, что переменная называется «_token».Я не знаю, что еще попробовать.

РЕДАКТИРОВАТЬ: при просмотре Symfony Profiler, это показано.Переменная «_token» существует, но я не нахожу способ использовать ее в представлении.

при использовании формы FOSUserBundle по умолчанию отображается значение _token.Я не мог найти, как это на самом деле отображается, так как он использует {{form_widget (form)}}, и когда я увидел соответствующий тип формы, я не увидел никакой подсказки по этому поводу.

enter image description here

Спасибо, Хайме

Ответы [ 3 ]

0 голосов
/ 24 сентября 2018

Наконец, это было проще, чем я думал.

Я просто добавил {{form_widget (form._token)}}, где токен должен быть в форме.Таким образом, правильное значение токена было отображено для скрытого поля ввода.

С уважением, Хайме

0 голосов
/ 09 ноября 2018

Для любого, кто пытается добавить токен csrf без генерации всей формы, вы можете использовать в своем шаблоне ветки {{ fos_csrf_provider.refreshToken('resetting') }}.Пример:

<!-- Form -->
                    <form id="change-password-form" action="{{ path("user_resetting_reset",{'token': token}) }}" method="post" name="change-password-form">
                        <div class="form-group">
                            <input id="change_password_first_password"  class="input form-control" required type="password" name="first" placeholder="{% trans %}New password{% endtrans %}">
                        </div>
                        <div class="form-group">
                            <input id="change_password_second_password" class="input form-control" required type="password" name="second" placeholder="{% trans %}Retype new password{% endtrans %}">
                        </div>
                        <input type="hidden" id="profile_token" name="_token" value="{{ fos_csrf_provider.refreshToken('resetting') }}" />
                        <button type="submit" class="btn btn-block ui-gradient-green shadow-md">Reset</button>
                    </form>
<!-- Form -->
0 голосов
/ 24 сентября 2018

Вы пробовали следующее?От Как реализовать защиту CSRF

<input type="hidden" name="_csrf_token"
    value="{{ csrf_token('authenticate') }}"
>
...