Bot Framework dotnet Slack适配器在更改事件请求Url时无法验证Slack请求



我有一个Slack机器人,它运行良好,可以与用户交互。我正在使用Bot Framework composer和Slack Adapter。在Slack API门户中,我正在尝试更改应用程序用于向我的机器人发送Slack事件的事件请求Url。当我这样做时,slack会向我的机器人发送一个挑战请求。机器人首先尝试验证该请求是否真的来自slack,如下所示:https://api.slack.com/authentication/verifying-requests-from-slack#a_recipe_for_security

问题是,这是失败的,我不明白为什么。我看到Slack正在发送所有正确的内容,并且ClientSigningSecret正在被读取,否则对机器人的其他调用将无法工作。

我知道这样问有点牵强,因为这似乎是我这边的问题。但由于当用户与机器人交谈时,机器人会很好地验证请求,而且代码来自Slack Adapter,它是开源的,我无能为力。。。。。也许有人遇到了同样的问题。

我创建了一张Slack的支持票,他们很快就回来了。

发布前状态

在发布Slack应用程序之前,唯一存在的配置是您在应用程序配置页面中看到的配置。这些是你用来测试你的应用程序的东西,其中包括将来自Slack的传入消息验证到你的后端的秘密。

首次发布Slack应用程序后

一旦你的应用程序发布,你的用户使用的生产版本将看到原始设置,包括机密,这些都是你的后端将获得的。您在配置页面中看到的设置类似于开发模式,在您请求Slack批准您的更改之前,它们不会持久化到已发布的应用程序中。这听起来很棒,也是人们所期望的,但你没有看到也无法想象正在发生的事情是,有一些开发时间的秘密与你在设置屏幕上看到的不同。

当您更改要发送到后端的端点url,以便它可以返回挑战,并且Slack将接受新的url时,消息负载将使用此开发机密,而不是您为后端配置的机密。因此,您的后端会拒绝该呼叫,因为它认为该呼叫不是来自Slack。

Slack提出的解决方案

不要在已发布的应用程序中验证此类型呼叫的传入请求的签名。我不喜欢它,但除非Slack改变这一点,否则没有其他解决办法。所以我做的是:

  1. 从后端删除仅针对此请求的检查,并发布到生产环境
  2. 在Slack中更改url
  3. 从后端还原更改

:(

最新更新