TOWN-TECH's log

2023年7月12日 13時35分

[Slack × PHP(Laravel)] Slackからのリクエスト検証を実装

関わっているOSSプロジェクトでslackからのリクエストレシーバー用のAPIを実装するタイミングがあったので実装周りを共有します。
参考にリクエスト検証のコードがあるPRも共有します。
PR [API共通] Slackリクエスト検証の共通処理を追加

やりたかったことの全体像

  • 外部のWebサービスからチーム内Slackの特定チャンネルに、不定期に通知が届く
  • slack apiで通知イベントを拾って、任意のURLへリクエストを投げる

20230712_blog_api_receive_image

実装手順(受信API:hogehogeReceiverの実装)

後述のslack api設定時に受信側のURLを設定するのですが、この際にURL妥当性をslack側に検証されます。
妥当性検証時は「url_verification」がリクエスト内に存在しているので、「challenge」をレスポンスとして返してあげる必要があります。
URL verification handshake

実装手順(受信API:validateSlackAPI()の実装)

slackのリクエスト署名検証の実装です。誰かれ構わずアクセスされても困るので、ちゃんとリクエスト内容を検証する必要があります。
リクエスト署名検証は下記2つの完全一致をもって妥当性を検証する仕組みです。
Verifying requests from Slack

  • slack側で生成したハッシュ値(SIGNING_SECRETというトークン+タイムスタンプ+内容)
    • ※slackからのリクエスト内容にこのハッシュ値がある
  • 受信側でリクエスト内容から生成したハッシュ値

実装手順(slack api)

※文字のみで恐縮です。slack側のバージョンによっては文言が多少違う可能性があります。

  • slack apiへアクセス
  •  アプリの作成
    • 「Create New App」を押下
    • 「From scratch」を選択
    • 「App Name」を入力
      • ※例:社内システムへのAPI連携
    • 「Pick a workspace to develop your app in」を選択
      • ※アプリをインストールしたいワークスペースを選択
    • 「Create App」を押下
  • Botユーザの作成
    • 「Basic Information」ページへ移動して「Add features and functionality」>「Bots」を選択
    • Display Name (Bot Name):
      • ※例:Transfer to syanai-system
    • Default Name:
      • ※例:transfer_syanai
  • トリガーイベントの定義
    • ※(前提) 「Request URL」入力と同時にslackはURLの妥当性検証を行う為、受信API側の実装は終わらせておく必要があります。
    • 「Event Subscriptions」ページへ移動して「Enable Events」をONにする
    • 「Request URL」を入力
      • ※例:https://www.xxx.com/hogehogeReceiver
        • 「Verified」と表示されれば成功です。うまくいかない時はwebサーバのlogで確認してください。
      • 「Subscribe to bot events」で「message.channels」を選択
  • ワークスペースへインストール
    • 「OAuth & Permissions」ページへ移動、「Install to Workspace」を選択
slack PHP Laravel