[Slack API] Bolt for JavaScript および Glitch で構築したサーバー環境のエンドポイントを Event Subscriptions に設定する際にハマったこと

2023.05.13

こんにちは、CX事業本部 Delivery部の若槻です。

今回は、Slack API を利用するために Bolt for JavaScript および Glitch で構築したサーバー環境のエンドポイントを Event Subscriptions に設定する際にハマったことについて共有します。

事象

ユーザーが Home Tab からインタラクティブな操作を行える Slack App を構築する方法を確認するために、こちらの公式チュートリアルを試していた時でした。

このチュートリアルの手順ではサーバー側を Glitch(Bolt for JavaScript)で実装します。

Slack App 側でのイベントをサブスクライブさせる Glitch のエンドポイント URL(`https://your-project.glitch.me/slack/events`)を Features > Event Subscriptions で設定するのですが、ここで URL の検証が失敗してしまいます。

Your request URL responded with an HTTP error. Update your URL to receive a new request and challenge value.

Your URL didn't respond with the value of the challenge parameter.

登録しようとした URL から challenge パラメーターが返ってきていないようです。

調査、原因

Glitch のサーバー側でログを確認してみると、警告が出力されています。(ちなみに デバッグのため index.js の記述を削って必要最低限にしています)

[WARN] bolt-app Request verification failed (code: slack_bolt_express_receiver_authenticity_error, message: Slack request signing verification failed. Signature mismatch.)

「Signature mismatch」とある通り Signature が不一致のため slack_bolt_express_receiver_authenticity_error が発生しているようです。

解決

Slack App の Settings > Basic Information > App Credentials から Signing Secret を取得します。

取得した Signing Secret を Glitch の .env に設定します。

再度 Event Subscriptions で URL 登録を試みると、今度は「Verified」となり、登録が成功しました。

URL 検証について

Slack でのイベント API リクエストの仕様についてはこちらに記載があります。

検証時に URL に送信されるペイロードは次のようになります。

{
    "token": "Jhj5dZrVaK7ZwHHjRyZWjbDl",
    "challenge": "3eZbrw1aBm2rZgRNFdxV2595E9CY3gmdALWMmHkvFXO7tYXAYM8P",
    "type": "url_verification"
}

こちらの記事では、サーバー側で Bolt を使わずに、明示的に challenge パラメーターを返すようにしています。

import json

def lambda_handler(event, context):
    # Return Slack challenge parameter
    return event['challenge']

しかし今回のように Bolt を使っている場合は明示的に上述のような実装をする必要はないようです。

おわりに

Slack API を利用するために Bolt for JavaScript および Glitch で構築したサーバー環境のエンドポイントを Event Subscriptions に設定する際にハマったことについての共有でした。

URL エンドポイントの所有権を確認するための検証なので、登録する URL のサーバー側で Slack App の Signature が必要なのはよく考えれば当然ですね。

しかし今回試そうとしていたチュートリアルではサーバー側への Signature の登録が項目として無かったため、手順に従ったところハマってしまいました。

参考

以上