Play Framework CSRF error " [CSRF] проверка не удалась, так как в заголовках не найден токен"



Я новичок в игровом фреймворке и пытаюсь представить форму, но
получаем такую ошибку: "P.filters.CSRF - [CSRF] проверка не удалась, так как в заголовках не найден токен" . Я использую Play 2.6, вот мой код контроллера:



    package controllers;

import play.libs.Json;
import play.mvc.*;

import views.html.*;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class HomeController extends Controller {

public Result index() {
return ok(index.render("Your new application is ready."));
}

public Result test() {
List<String> list = new ArrayList<>();
list.add("Jobs");
list.add("Work");
list.add("Say");
list.add("Stop");
return ok(test.render("test", list));
}

public Result testPost() {
Map<String,String[]> form = request().body().asFormUrlEncoded();
return ok(Json.toJson(form)).as("application/json");
}

}


Шаблон:



@(title: String, list: List[String])

@import helper._

<!DOCTYPE html>
<html lang="en">
<head>
<title>@title</title>
</head>
<body>
<form action="/test" method="post">
<textarea name="raw_text">

</textarea>
@CSRF.formField
<input type="submit" value="Submit" />
</form>
</body>
</html>


Что я делаю не так?

403   1  

1 ответ:

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

sbt new playframework/play-java-seed.g8

Размещение "Testing testing" в качестве содержимого textArea возвращает следующий Json (как показано браузером):

raw_text    
0   "            Testing testing"
csrfToken   
0   "8fdc72b2d628e4fc0d8f6359f2ea247cc0f22e5c-1499016237415-3c043ab2a02c18020df21a1f"

Единственное, что я взял из своих собственных проектов, - это модифицированный класс фильтров, который выглядит следующим образом:

import play.mvc.EssentialFilter;
import play.filters.cors.CORSFilter;
import play.http.HttpFilters;
import play.filters.csrf.CSRFFilter;
import play.filters.headers.SecurityHeadersFilter;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Named;
import java.util.Arrays;
public class Filters implements HttpFilters {
    @Inject 
    CSRFFilter csrfFilter;
    @Inject
    CORSFilter corsFilter;
    @Inject 
    SecurityHeadersFilter secHeaders;

    @Override
    public List<EssentialFilter> getFilters() {

        return Arrays.<EssentialFilter>asList(new EssentialFilter[] { corsFilter.asJava(),secHeaders.asJava(), csrfFilter.asJava()});
                }
}

Также мои маршруты следующие в conf / маршруты:

# Map static resources from the /public folder to the /assets URL path
GET     /assets/*file               controllers.Assets.versioned(path="/public", file: Asset)
GET / controllers.HomeController.test()
POST /test controllers.HomeController.testPost()

Удаление @CSRF.formField вызвало CSRF атак несанкционированного как раз для вас.

Если у вас есть какие-либо очевидные различия с вашей установкой, я был бы рад копнуть дальше, но это, кажется, не является прямой проблемой с вашим кодом.

Comments

    Ничего не найдено.