1

我正在使用 Symfony 和 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
4

2 回答 2

1

如果您将请求数据验证为 Symfony 表单,那是正确的。由于$I->sendPUT(...)您没有发送任何 CSRF 令牌,这就是它给您错误的原因。

您可以使用 FOSRestBundle 为特定角色禁用 CSRF,请参阅http://symfony.com/doc/current/bundles/FOSRestBundle/2-the-view-layer.html#csrf-validation

另一种选择当然是发送 CSRF 令牌。

于 2016-11-07T09:32:37.683 回答
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

它正在工作。

感谢马丁,帮助

于 2016-11-07T10:49:02.930 回答