POST 对 CakePHP 3 API 的请求不工作
POST Requests for CakePHP 3 API are not working
我正在使用 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"
}
]
}
但是,当我在同一个 url 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);
在我的控制器的操作中,但这是我在 post 请求时遇到同样的错误。如果有人遇到同样的问题,请帮助我取得突破。
如 中所述,默认应用模板最近默认启用了 CSRF 保护中间件,要求 CSRF 令牌和 cookie 与非 GET
请求。
您 API 很可能需要某种形式的身份验证,如果身份验证不依赖于 cookie,或 (HTTP) 基本身份验证,或 browsers/clients 的任何其他形式的身份验证将自动 send/perform 使用 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')
之类的请求对象上可用)给您的客户,以便他们可以将它们与请求一起发送。
另见
我正在使用 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"
}
]
}
但是,当我在同一个 url 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);
在我的控制器的操作中,但这是我在 post 请求时遇到同样的错误。如果有人遇到同样的问题,请帮助我取得突破。
如 GET
请求。
您 API 很可能需要某种形式的身份验证,如果身份验证不依赖于 cookie,或 (HTTP) 基本身份验证,或 browsers/clients 的任何其他形式的身份验证将自动 send/perform 使用 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')
之类的请求对象上可用)给您的客户,以便他们可以将它们与请求一起发送。