Slack App Slash 命令 - 检测到无效签名(401 未经授权)

问题描述 投票:0回答:2

好的,让我们搭建舞台吧。

我正在尝试使用 Java JDK 14、gradle 和 ngrok 构建一个 slack 应用程序。 (以及 Slack 的 SDK 模块 Bolt)

到目前为止,我已经能够非常轻松地包含所需的依赖项,并且我的问题似乎与我的依赖项管理完全无关。它建立了。至少,它可以构建。

slack命令配置:

The slack command configuration


一些笔记,因为因为某些原因无法整理思路。

我确保每次刷新 ngrok 时都更改请求 URL。

我已验证我的 slack 机器人令牌和我的 slack 签名密钥是正确的。

主要程序代码:

package SlackApp;

import com.slack.api.bolt.App;
import com.slack.api.bolt.jetty.SlackAppServer;

public class Program {

    public static void main(String[] args) throws Exception {
        App app = new App();

        app.command("/echo", (req, ctx) -> {
            return ctx.ack(":wave: testing");
        });

        SlackAppServer server = new SlackAppServer(app);
        
        server.start();
    }
}

出于某种原因,每当我在开发工作区中使用斜杠命令时(我还没有开始对多个工作区进行 oAuth,我只是在测试东西),记录器会显示此信息(我已经在 google 上搜索过,但没有找到任何信息)适当的解决方案):

INFO com.slack.api.bolt.middleware.builtin.RequestVerification - Invalid signature detected 
- v0=ee1b7da78a098a8b974c119873b1782c843b8bef1dce192b68ea0df4ccf86b23

这就是我所在的地方。 Slack 的文档称构建 Slack 应用程序的过程如下:

您的应用程序需要执行的所有操作来处理斜线命令请求是:

  1. 验证来自 Slack 的请求

  2. 解析请求正文并检查命令是否是您想要的命令 喜欢处理

  3. 建立回复消息或做任何你想做的事情

  4. 以 200 OK 响应 Slack API 服务器作为确认

我实际上并没有验证来自 slack 的请求,但如果我只是玩玩,我认为没有必要这样做。你能提供一些见解吗?

java slack slack-api ngrok slack-commands
2个回答
5
投票

我面临着完全相同的问题,这对我有用:

如果您在 IDE 中运行项目,则必须弄清楚如何在 IDE 中设置运行时环境变量。

我用的是intelliJ。设置环境变量:

  1. 从主菜单中,选择运行 |编辑配置或选择编辑 来自运行/调试配置选择器的配置 工具栏。
  2. 从主菜单中,选择运行 |编辑配置或选择编辑 来自运行/调试配置选择器的配置 工具栏。
  3. 在“运行/调试配置”对话框中,选择一个配置,其中 您要添加环境变量。输入变量名称和值:=.
  4. 如果要添加多个变量,应使用分号分隔。在这种情况下,它将是 SLACK_BOT_TOKEN=xoxb.....;SLACK_SIGNING_SECRET=xxxxx

不,您不需要实际验证请求等,因为 Bolt 中间件作为内置的 请求验证类

为您完成此操作

您的应用程序不需要手动返回任何响应,一切都由 Bolt 本身处理。 只需设置 Env 变量就足够了!

希望这有帮助!


0
投票

添加@deepika-karanji 的答案,当收到请求时预期的签名密钥不存在时,就会出现此错误。要解决此问题,请从 https://api.slack.com/apps 收集变量。签名密钥位于设置 > 基本信息 > 应用程序凭据下,机器人令牌位于功能 > OAuth 和权限下。

如果没有 IDE,可以在运行应用程序之前使用以下命令从命令行导出这些变量:

$ export SLACK_BOT_TOKEN=xoxb-example-token
$ export SLACK_SIGNING_SECRET=examplesecret

您可以使用一些打印语句来验证在运行应用程序时是否找到了这些内容:

package SlackApp;

import com.slack.api.bolt.App;
import com.slack.api.bolt.jetty.SlackAppServer;

public class Program {
    public static void main(String[] args) throws Exception {  
        String token = System.getenv("SLACK_BOT_TOKEN");
        String secret = System.getenv("SLACK_SIGNING_SECRET");
        System.out.println("Token value: " + token);
        System.out.println("Secret value: " + secret);

        // App expects the following environment variables: 
        //   SLACK_BOT_TOKEN
        //   SLACK_SIGNING_SECRET
        App app = new App();
        app.command("/echo", (req, ctx) -> {
            return ctx.ack(":wave: testing");
        });
        SlackAppServer server = new SlackAppServer(app);
        server.start();
    }
}

参考:https://slack.dev/java-slack-sdk/guides/getting-started-with-bolt#start-the-app-with-two-env-variables

© www.soinside.com 2019 - 2024. All rights reserved.