[Slack × PHP(Laravel)] Slackからのリクエスト検証を実装
関わっているOSSプロジェクトでslackからのリクエストレシーバー用のAPIを実装するタイミングがあったので実装周りを共有します。
参考にリクエスト検証のコードがあるPRも共有します。
PR [API共通] Slackリクエスト検証の共通処理を追加
やりたかったことの全体像
- 外部のWebサービスからチーム内Slackの特定チャンネルに、不定期に通知が届く
- slack apiで通知イベントを拾って、任意のURLへリクエストを投げる
実装手順(受信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」を選択
- ※例:https://www.xxx.com/hogehogeReceiver
- ワークスペースへインストール
- 「OAuth & Permissions」ページへ移動、「Install to Workspace」を選択