从事 Phabricator 扩展的工作让我重新回到了 PHP 的世界,过去几年我只通过 WordPress 插件和博客主题接触过这种语言。尽管远离了这门语言,但我还是能够相当快地跳回去并感到一种小小的“回到家”的安慰……直到我意识到 Phabricator 没有大量的文档并且我需要深入研究源代码弄清楚如何完成每项任务。
让我困惑了一段时间的一个错误如下:
您正在尝试将一些数据保存到 Phabricator,但您的浏览器发出的请求包含不正确的标记。重新加载页面并重试。您可能需要清除您的 cookie。
您正在尝试将一些数据保存到 Phabricator,但您的浏览器发出的请求包含不正确的标记。重新加载页面并重试。您可能需要清除您的 cookie。
为了允许通过第三方服务登录,我试图创建并保存一个 PhabricatorAuthTemporaryToken
实例,并且从该服务到 Phabricator 的请求是在后台发出的,所以没有PHCID 因为没有会话,因此 CSRF 令牌无效。本质上,我需要一种无需 CSRF 验证(通过 PHCID)步骤即可写入 Phabricator 的方法。解决方案很简单:
// Turn off CSRF check $unguarded = AphrontWriteGuard::beginScopedUnguardedWrites(); // Save token id(new PhabricatorAuthTemporaryToken()) ->setTokenResource($transaction_code) // ... ->save(); // Turn CSRF check back on unset($unguarded);
AphrontWriteGuard::beginScopedUnguardedWrites()
允许我关闭 CSRF 检查,保存令牌,然后通过 unset
重新打开 CSRF 检查。代码量少,找起来费时费力!
我喜欢像 Phabricator 这样的高级库坚持进行这些安全检查,而无需开发人员明确地这样做;我也喜欢暂时关闭此检查很容易。当我遇到问题时,一定会分享更多 PHP / Phabricator 技巧!