1

Я использую Symfony и FosRestBundle.Симфония - токен CSRF недействителен - FosRestBundle

Когда я хочу, чтобы просто проверить мой REST API, я получил это:

CSRF токен является недействительным. Повторите отправку формы.

/** 
    * @example ["titre", "short description", "description", "2016-10-10", 200, "with complete data"] 
    * @example ["titre", "short description", "description", "2016-10-31", 200, "with complete data"] 
    */ 
    public function editNewsTest(ApiTester $I, Example $example) 
    { 

     $I->wantTo('edit a news (' . $example[5] . ')'); 
     $I->haveHttpHeader('Content-Type', 'application/json'); 
     $I->sendPUT('/news', ['title' => $example[0], 'shortDescription' => $example[1], 'description' => $example[2], 'date' => $example[3]]); 
     $I->seeResponseCodeIs($example[4]); // 200 
     $I->seeResponseIsJson(); 

    } 

Вот моя конфигурация FosRestBundle:

#FOSRestBundle 
fos_rest: 
    service: 
     inflector: appbundle.util.inflector 
    param_fetcher_listener: force 
    body_listener: 
     array_normalizer: fos_rest.normalizer.camel_keys 
    format_listener: true 
    view: 
     view_response_listener: 'force' 
     formats: 
      json : true 
     templating_formats: 
      html: true 
     force_redirects: 
      html: true 
     failed_validation: HTTP_BAD_REQUEST 
     default_engine: twig 
    routing_loader: 
     default_format: json 
     include_format: false 
    serializer: 
     serialize_null: true 
    access_denied_listener: 
     json: true 
    exception: 
     enabled: true 
     messages: 
      Symfony\Component\HttpKernel\Exception\BadRequestHttpException: true 
    disable_csrf_role: IS_AUTHENTICATED_ANONYMOUSLY 

ответ

1

Это правильно, если вы проверяете данные запроса в качестве формы Symfony. С помощью $I->sendPUT(...) вы не отправляете токен CSRF, поэтому он дает вам ошибку.

Вы можете отключить CSRF с FOSRestBundle для определенных ролей, см http://symfony.com/doc/current/bundles/FOSRestBundle/2-the-view-layer.html#csrf-validation

Другой вариант отправить также CSRF токен конечно.

+0

Привет, я уже отключил CSRF (disable_csrf_role: IS_AUTHENTICATED_ANONYMOUSLY) – Xero

+0

'IS_AUTHENTICATED_ANONYMOUSLY' не роль. http://stackoverflow.com/questions/39973519/symfony2-set-security-access-control-to-allow-only-authenticated-anonymously/39973846#39973846 – martin

+0

@Xero Также описано здесь http://symfony.com/doc /current/security.html#checking-to-see-if-a-user-is-logged-in-is-authenticated-fully – martin

0

Я не был идентифицирован, потому что мой security.yml выглядеть так:

dev: 
    pattern: ^/ 
    security: false 

Я изменить это, и добавить новый брандмауэр

dev: 
    pattern: ^/(_(profiler|wdt)|css|images|js)/ 
    security: false 

test: 
    anonymous: ~ 
    pattern: ^/ 

Теперь с этим в config.yml:

disable_csrf_role: IS_AUTHENTICATED_ANONYMOUSLY 

Работает.

Благодаря Мартину, за помощь