Формы UserFrosting — неверный или отсутствующий токен CSRF

Я пытаюсь отправить простую форму в UserFrosting и в качестве теста отображать только сообщение об успехе, без изменения данных. Я следовал указаниям Урок 2 но я столкнулся с CSRF вопрос:

UserFrosting возвращает следующую ошибку:

Неверный или отсутствующий токен CSRF.

Что мне не хватает? До этого момента UserFrosting было очень легко переварить 🙁

Форма:

<form class="form-horizontal" role="form" name="requestDescription" action="{{site.uri.public}}/soap/requests/desc/edit/{{ keyname }}" method="post">
<div class="form-group">
<label for="input_group" class="col-md-2 control-label">Name</label>
<div class="col-md-10">
<input type="text" id="input_name" class="form-control" name="lgname" placeholder="{{ name }}">
</div>
</div>
<div class="form-group text-center">
<button type="submit" class="btn btn-success text-center">Update</button>
</div>
</form>

с добавленной частью скрипта в конец файла ветки:

<script>
$(document).ready(function() {
// Load the validator rules for this form
var validators = {{validators | raw}};
ufFormSubmit(
$("form[name='requestDescription']"),
validators,
$("#userfrosting-alerts"),
function(data, statusText, jqXHR) {
// Reload the page on success
window.location.reload(true);
}
);
});
</script>

Вот мои две функции от контроллера:

public function soapRequestDescriptionEditPage($keyname){
if (!$this->_app->user->checkAccess('uri_soap_requests')){
$this->_app->notFound();
}
$requestDetails = $this->soapRequestReadMeta($keyname);

$schema = new \Fortress\RequestSchema($this->_app->config('schema.path') . "/forms/soap-request-description-edit.json");
$this->_app->jsValidator->setSchema($schema);

$this->_app->render('soap/soap-request-description-edit.twig', [
"name" => $requestDetails['name'],
"description" => $requestDetails['description'],
"keyname" => $keyname,
"validators" => $this->_app->jsValidator->rules()
]);
}

public function test(){
if (!$this->_app->user->checkAccess('uri_soap_requests')) {
$this->_app->notFound();
}
$post = $this->_app->request->post();
$ms = $this->_app->alerts;
$requestSchema = new \Fortress\RequestSchema($this->_app->config('schema.path') . "/forms/soap-request-description-edit.json");
$rf = new \Fortress\HTTPRequestFortress($ms, $requestSchema, $post);
$ms->addMessageTranslated("success", "Everyone's title has been updated!", $post);
$rf->sanitize();
if (!$rf->validate()) {
$this->_app->halt(400);
}
$data = $rf->data();
}

Записи от index.php файл:

$app->post('/soap/requests/desc/edit/:request_id/?', function () use ($app) {
$controller = new UF\SoapController($app);
return $controller->test();
});
$app->get('/soap/requests/desc/edit/:request_id/?', function ($request_id) use ($app) {
$controller = new UF\SoapController($app);
return $controller->soapRequestDescriptionEditPage($request_id);
});

Наконец, схема:

{
"lgname" : {
"validators" : {
"length" : {
"min" : 1,
"max" : 150,
"message" : "The new title must be between 1 and 150 characters long."}
},
"sanitizers" : {
"raw" : ""}
}
}

1

Решение

Начиная с UserFrosting 4, вы должны явно добавлять скрытые поля ввода CSRF в форму. Есть частичный шаблон forms/csrf.html.twig который содержит эти поля, которые вы можете вставить с помощью Twig’s include тег:

<form class="form-horizontal" role="form" name="requestDescription" action="{{site.uri.public}}/soap/requests/desc/edit/{{ keyname }}" method="post">
{% include "forms/csrf.html.twig" %}
<div class="form-group">
<label for="input_group" class="col-md-2 control-label">Name</label>
<div class="col-md-10">
<input type="text" id="input_name" class="form-control" name="lgname" placeholder="{{ name }}">
</div>
</div>
<div class="form-group text-center">
<button type="submit" class="btn btn-success text-center">Update</button>
</div>
</form>

Для запросов, которые сделаны без формы (например, если она была создана исключительно в Javascript), вы можете получить имя и значение токена CSRF из глобального site.csrf переменная:

var userName = 'luke';
var fieldName = 'lgname';

var data = {
'value': fieldValue
};

data[site.csrf.keys.name] = site.csrf.name;
data[site.csrf.keys.value] = site.csrf.value;

var url = site.uri.public + '/api/users/u/' + userName + '/' + fieldName;

return $.ajax({
type: "PUT",
url: url,
data: data
}).done(function (response) {
window.location.reload();
});
1

Другие решения

Оказалось, что мой код был в порядке. На странице возникли несвязанные ошибки JavaScript, влияющие на обработку формы UserFrosting. Исправление этих ошибок позволило UserFrosting обрабатывать форму.

Обратите внимание на себя … сделать привычкой заглядывать в консоль на наличие ошибок javascript 🙂

0

По вопросам рекламы [email protected]