<!-- csrfToken用の空のPOSTフォーム -->
<?= $this->Form->create(null, ['url' => '', 'type' => 'post']) ?>
<?= $this->Form->end() ?>
var token = $('input[name=_csrfToken]').val();
関わっているプロジェクトのソースコードを見ると、上記のような記述が多数ありました。Formヘルパーのcreate()メソッドが自動的にinput:hiddenの値として出力するCSRFトークンを取得するために、このように書いているようです。
Ajaxリクエストを行う際には必ずしもForm要素を必要としませんが、CSRFトークン文字列を出力するためだけにForm::create()を記述するのはあまりスマートとは言えません。
https://book.cakephp.org/3/ja/controllers/components/csrf.html
公式ドキュメントを読んでみました。
CsrfComponent はユーザーのブラウザーにクッキーを設定することで動作します。 フォームが Cake\View\Helper\FormHelper を用いて作成されている場合、 hidden フィールドに CSRF トークンが追加されます。 Controller.startup イベントの間、 もしリクエストが POST, PUT, DELETE, PATCH リクエストの場合は、 コンポーネントはリクエストデータとクッキーの値を比較します。
上記はドキュメント冒頭の記述ですが、ここにヒントが書いてあります。「クッキーを設定することで動作」とのことです。
var token = "<?= $this->request->getCookie('csrfToken') ?>";
これでOKです。
$token = $this->request->getParam('_csrfToken');
このようにも書いてますが、、、Requestオブジェクトが生成されるタイミングによるのでは?
もう少し公式ドキュメントが親切だといいな~と思います・・