PHP Slim 框架在每个连接上生成 CSRF 令牌

PHP Slim framework generates CSRF Token on each connection

目前我正在尝试建立一个以 slim 作为后端和 angularJS 作为前端的网站。因此我看了几个教程和演示项目。这是最有趣的一个:https://github.com/alexdebril/slim-angular

开箱即用我对 CSRF 实施有疑问。在这个项目中,CSRF 保护是在中间件中实现的,以便应用于每个连接。好不好不重要
但是,当我使用 composer 和 npm 安装所有依赖项时,该项目无法正常运行,因为每个服务器连接都会获得一个新的 CSRF 令牌,该令牌将存储在 PHP 会话中。

所以在这个项目的主页上有一个 angular 表单,它将用 csrf 令牌保护的字符串发送到服务器。然后服务器只用相同的字符串回复并且 angular 控制器将其打印出来。当我第一次触发表单提交时,一切都会好起来的,但是在第二次提交时,服务器将以错误 400 响应,因为他有一个 angular 还没有的新 csrf 令牌。

但是这个示例项目的创建者不可能犯这样的错误,对吧?为什么我的 apache 会为与同一用户的每个连接创建一个新的 csrf 令牌?我该如何解决这个问题?

我的依赖项:
slim\slim v3.8.1
slim\csrf v0.7.0
angular v1.6.4(路由、aria、material、ui-bootstrap、cookie、http-auth-interceptor)

那么如何才能让每个用户只有一个 CSRF 令牌呢?
或者我必须如何更新 angular 中的分词器服务才能始终使用最新的 CSRF 令牌?或者我需要一个观察者?检测这个?

他们似乎在使用 slim-csrf, which fortunately has a setting to disable regenerating the CSRF token on every request. According to the GitHub readme:

By default, Slim\Csrf\Guard will generate a fresh name/value pair after each request. This is an important security measure for certain situations. However, in many cases this is unnecessary, and a single token throughout the user's session will suffice. By using per-session requests it becomes easier, for example, to process AJAX requests without having to retrieve a new CSRF token (by reloading the page or making a separate request) after each request.

因此,在/php/middleware.php中,只需将第6个参数设置为true,其余的保留为null。有关其他 5 个选项的列表,您可以查看 source.

我删除了 Slim 自己的 CSRF 包 (slim/csrf),因为除了 angular 之外还有几个问题。
相反,我现在使用将在 header 中传输的 XSRF 令牌。 Angular 可以很好地处理这个问题,而且完全开箱即用。