私は、フォームの外にあるリンクがあり、AngularコントローラがデータをポストするYiiアプリケーションを持っています。問題は、YiiがCSRFトークンを検証しないときです。Yii 1.1.17:Angular Controller経由のPOSTでCSRFトークンの検証が失敗する
:
notificationsService.markAllAsRead = function (user_id, csrf) {
var dataObject = {
user_id: user_id,
YII_CSRF_TOKEN: csrf
};
$http.post("/api/notifications/readAll", dataObject).success(function (data) {
return data;
});
};
POSTリクエストがこのliekなります
<a id="yt1" href="#" ng-click="markAllAsRead(23, '1eb4e3ac755e22939a0fc8d5ea0e9bacb453319a')" title="Read All" tooltips-size="small" tooltips="1" class="notification-tool ng-isolate-scope"><i class="fa fa-eye"></i></a>
マイ角度コントローラは、このように見える角度サービスを呼び出しますCSRF検証を無効にすると、呼び出しは成功します。
アイデア?
ありがとうございます!
完全な答えは:
は、いくつかの調査の後、私は角度がデータを投稿したにもかかわらず、$_POST
(ものYiiの$request->getPost()
)は実際に空であったことに気づきました。 this answerをstackoverflowで読むと、Angular JSとそのデフォルト動作がapllication/json
(まあまあまあまあ問題ではないかもしれません)として投稿されるという問題が実際にあるようです。この質問への顕著な答えによって提案され、リンクされた解答の提案に基づいて、私は次のようにYiiのからCHttpRequest
クラスをオーバーライドしてしまった:
class AppRequest extends CHttpRequest
{
public function validateCsrfToken($event)
{
if ($this->getIsPostRequest() ||
$this->getIsPutRequest() ||
$this->getIsPatchRequest() ||
$this->getIsDeleteRequest()
) {
$cookies = $this->getCookies();
$method = $this->getRequestType();
switch ($method) {
case 'POST':
if (empty($this->getPost($this->csrfTokenName))) {
$input = json_decode(file_get_contents('php://input'), true);;
$userToken = $input[$this->csrfTokenName];
} else {
$userToken = $this->getPost($this->csrfTokenName);
}
break;
case 'PUT':
if (empty($this->getPut($this->csrfTokenName))) {
$input = json_decode(file_get_contents('php://input'), true);;
$userToken = $input[$this->csrfTokenName];
} else {
$userToken = $this->getPut($this->csrfTokenName);
}
break;
case 'PATCH':
if (empty($this->getPatch($this->csrfTokenName))) {
$input = json_decode(file_get_contents('php://input'), true);;
$userToken = $input[$this->csrfTokenName];
} else {
$userToken = $this->getPatch($this->csrfTokenName);
}
break;
case 'DELETE':
if (empty($this->getDelete($this->csrfTokenName))) {
$input = json_decode(file_get_contents('php://input'), true);;
$userToken = $input[$this->csrfTokenName];
} else {
$userToken = $this->getDelete($this->csrfTokenName);
}
break;
}
if (!empty($userToken) && $cookies->contains($this->csrfTokenName)) {
$cookieToken = $cookies->itemAt($this->csrfTokenName)->value;
$valid = $cookieToken === $userToken;
} else
$valid = false;
if (!$valid)
throw new CHttpException(400, Yii::t('yii', 'The CSRF token could not be verified.'));
}
}
}
ステータス「400」は、サーバー側で何か問題が発生したことを意味します。必要なパラメーターが本文から正しく渡されない可能性があります。 –
@PankajParkar csrf検証を無効にすると動作します。 – Comforse
あなたはそれを好きなように答えとして追加することができます。 –