CakePHP 3 API的POST请求不起作用

时间:2018-08-20 13:04:18

标签: rest cakephp cakephp-3.x csrf-protection

我正在使用CakePHP 3.x文档开发API。为了开发此API,我使用了他们的官方文档:https://book.cakephp.org/3.0/en/development/rest.html

当我尝试使用URL http://localhost/healthcare_portal/eapi/applicants/index.json上的GET请求访问我的api时,我得到了预期的json结果

{
    "applicants": [
        {
            "applicant_id": 1,
            "name": "Manender"
        },
        {
            "applicant_id": 2,
            "name": "mayank"
        }
    ]
}

但是,当我在同一网址http://localhost/healthcare_portal/eapi/applicants/index.json上使用POST请求访问我的api时,出现CSRF不匹配令牌错误。在这种情况下,来自API的响应是

{
    "message": "Missing CSRF token cookie",
    "url": "/applicants/index.json",
    "code": 403,
    "file": "/opt/lampp/htdocs/healthcare_portal/eapi/vendor/cakephp/cakephp/src/Http/Middleware/CsrfProtectionMiddleware.php",
    "line": 191
}

我尝试了其他替代方法

 $input = (array) $this->request->input('json_decode', true);

在我的控制器的操作中,但这是我在发布请求时收到相同的错误。如果有人遇到同样的问题,请帮助我取得突破。

1 个答案:

答案 0 :(得分:2)

CSRF token mismatch in post request in 3.6 version 中所述,默认应用模板最近默认启用了CSRF保护中间件,要求CSRF令牌和cookie与非GET请求一起发送

您的API最有可能需要某种形式的身份验证,并且在身份验证不依赖Cookie或(HTTP)基本身份验证,或浏览器/客户端将自动通过HTTP请求发送/执行的任何其他形式的身份验证的情况下,那么您就不需要CSRF保护,因为CSRF是不可能的。

如果您不需要需要CSRF保护

如果您的API确实不需要CSRF保护,则可以禁用它,例如,通过使用自定义中间件处理程序来检查请求URL或路由并有条件地应用CSRF中间件,或者通过在路由范围,以便您可以排除API范围,请参见 Cakephp 3.5.6 disable CSRF Middleware for controller

如果您需要需要CSRF保护

如果您的API使用的 易于CSRF的身份验证形式,那么您应该找出一种服务cookie的方法(中间件会根据GET请求自动设置cookie )和CSRF令牌(它们可以在$request->getParam('_csrfToken')之类的请求对象上使用)提供给您的客户,以便他们可以将其与请求一起发送。

另请参见