我正在利用PHP开发Slack和Filemaker之间的集成。我成功地让代码在基于json请求的Filemaker中创建记录,并且也可以毫无困难地将挑战密钥返回给Slack。
但是,我在将攻击传递回Slack时无法将标题响应200 OK传递给Slack。看起来它必须是一个或另一个。
我已经尝试将HTTP标头移动到代码中的不同区域,但到目前为止还没有取得任何成功。
以下是当前代码:
<?php
$data = json_decode(file_get_contents('php://input'), true);
if (!isset($data["challenge"])) {
$body = $_SERVER['HTTP_X_SLACK_RETRY_REASON'];
require_once ('Filemaker.php');
//$body = file_get_contents('php://input');
$fm = new Filemaker();
$fm->setProperty('database', '');
$fm->setProperty('username', '');
$fm->setProperty('password', '');
$command = $fm->newPerformScriptCommand('PHP_RESPONSE', 'script', $body);
$result = $command->execute();
}
else {
header("Content-Type: text/plain");
header('X-PHP-Response-Code: 200', true, 200);
echo $data["challenge"];
}
?>
我期望的结果是代码返回Slack的质询代码,同时还返回200 OK的HTTP头。
目前我可以看到我收到错误&#34; http_error&#34;来自Slack,这让我相信问题是标题没有成功传回。
任何有关错误的想法或关于正确方向的建议都将不胜感激。
答案 0 :(得分:1)
问题出现了,因为事件松弛不会在发送事件时将“challenge”作为参数发送。看起来只有在最初设置事件API的URL时才需要回显“挑战”。
我将挑战echo包含在if语句中,该语句仅在挑战变量存在时触发。完成后,200 OK成功通过。
以下是我用来解决问题的代码:
$data = json_decode(file_get_contents('php://input'), true);
if (isset($data["challenge"])) {
$message = [
"challenge" => $data["challenge"]
];
header('Content-Type: application/json');
echo json_encode($message);
}
答案 1 :(得分:0)
documentation实际上在这个主题上有点不一致。它声称您可以在计划文本中回应挑战,但该示例将其显示为x-www-form-urlencoded。
为了安全起见,请尝试将挑战作为JSON返回。这对我来说非常合适。您也不需要显式设置HTTP 200代码。
示例代码:
$message = [
"challenge" => $data["challenge"]
];
header('content-type: application/json');
echo json_encode($message);