slack apiでリクエストの検証をする 〜 integromat

# はじめに
integromatでセキュリティ周りをすんなり実装する方法が探せず、やってみたことをまとめました。
いろんなパラメータが丸見えになりますので、画像中にマスクを入れてます。

こちらで作成したシナリオを再利用した内容です。
https://qiita.com/nofrmm/items/81dea29db5e4338e7c8d
0から始める場合はWebhookのURLを追加する時点で
https://qiita.com/drafts/c05fa1cc54c1c58c5b51/edit#url%E3%81%AE%E5%A4%89%E6%9B%B4
こちらの内容を組み入れて始めると後々変更の手間がないです。

# 実装
Webhookの設定の細かいところと
関数の使い方を理解して進められる内容です。

ここのページを見ても実装はできません。
https://api.slack.com/lang/ja-jp/securing-your-slack-app
見るべきはこちらの英語版
https://api.slack.com/authentication/verifying-requests-from-slack#verifying-requests-from-slack-using-signing-secrets__a-recipe-for-security__step-by-step-walk-through-for-validating-a-request

## Webhookを修正
設定がデフォルトではヘッダーが取得できないのとbody部がデシリアライズ化されているので
body部を生のJSONのまま取得できるように設定を変更します。

![スクリーンショット 2020-10-17 19.54.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12362/cf43f6cc-e960-a3a6-7279-e58f35b850cb.png)

`Show advanced settings`にチェックをつけると必要な項目が表示されます。
`Get request headers`と`JSON pass-through`にチェックを入れてセーブします。
![スクリーンショット 2020-10-17 19.52.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12362/40f08d9c-4bd4-1d5d-b2f0-698ef1e250bb.png)

シナリオを開いて、Webhook の `Re-determine data structure`をクリックして
データ構成を取得し直します。
![スクリーンショット 2020-10-17 20.48.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12362/53af393d-d450-419c-4bb5-6255b4a66812.png)

この状態になったら、slackから実行したいAPIを動かすアクションを行います（メッセージ送信など）
![スクリーンショット 2020-10-17 21.07.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12362/cb2de734-e8b7-ef1b-212d-eddacaae4ff4.png)

（1）POSTされたBODY部のJSONがvalueでそのまま取得できるようになっています。
（2）`x-slack-signature`と`x-slack-request-timestamp`を取得できるようになりました。
![スクリーンショット 2020-10-17 21.51.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12362/3dd3ff22-c76f-66bf-8a78-6ac93a2a0012.png)

##JSONをparse
扱いやすいようにparseして変更前同様にあつかえるようにします。
![スクリーンショット 2020-10-17 22.12.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12362/198ed456-edaa-06ac-9e82-1b1108062638.png)
![スクリーンショット 2020-10-17 22.15.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12362/214aa267-93f6-a5df-bc90-b9ee90510ead.png)

変更前のWebhookのパラメータを参照していた箇所はJSONをparseしたJSONモジュールのパラメータに置き換えて更新します。
（integromatで発行したURLをだし直しするのが一番楽かも）

#フィルタを追加
ヘッダパラメータの存在チェックと、verifyをフィルタで実施します。
URLからのリクエストの再利用防止で1分チェックを追加しました（実装例は5分）
![スクリーンショット 2020-10-18 21.36.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12362/5427df3a-39c5-bee0-ae32-bd750a23e0da.png)

![スクリーンショット 2020-10-18 7.24.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12362/1b1db8b6-64df-0f7c-b3a6-069adec2b99d.png)

# 確認方法の補足
##関数
実装する関数にオンマウスすると説明が表示されます。
![スクリーンショット 2020-10-18 7.12.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12362/aa4f8376-08c8-d8da-a980-23845bb32216.png)

### ドキュメントは・・・
不十分感あります（2020/10現在）
使われにくい要因はこういったところにあるのかも。実装と同期を取れるよう調整してほしい。
https://support.integromat.com/hc/en-us/articles/360005771433-String-Functions
![スクリーンショット 2020-10-18 7.16.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12362/118e5072-d406-f439-0332-ca33b0982141.png)
##URLの変更
integromatでは簡単にURLを変更可能です。
サービスとして素敵だなと思いました。
slackの方で同一のURLを設定し直す時、リクエストを飛ばしてない動作を確認しています。
urlのverificationでは複数のURLを使えると検証がしやすい。

![スクリーンショット 2020-10-18 6.29.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12362/6a07fd30-0bd1-1528-ea5e-24e7869cf69e.png)

## デバッグ（パラメータチェック）
他に方法ないかな、と思いながら出力用に変数をいくつか用意して
パラメータをチェックして調整しました。

![スクリーンショット 2020-10-17 23.20.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12362/4e8b61d1-7898-30cf-b480-c8281e21b238.png)

![スクリーンショット 2020-10-17 23.20.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12362/7b4a90d1-71ff-bda1-3125-ae1d88c1e362.png)

本当にOperationの消費が早い
デバッグが終わればこのモジュールは消します。

# さいごに

ノーコードと聞くと素人でも簡単にできそうな感じが落とし穴です。
簡単にできるから、感覚で組んで、使用しているシナリオのOperationが跳ね上がるのが
目で見えて、それに対策が組めるかでこのサービスの利用を継続できるかの判断になるはずです。

## Operationの削減が課題
手探りで実装を組む、確認する、を工程を繰り返すと、Free枠はあっという間になくなります。多少お金を出すつもりで実装を進めることをお勧めします。
一度の実行で、最低限かかるOperationは履歴から確認できるのでOperationを削減できる方法が見えてきます。

## Operation、転送容量の追加購入

Operationや転送量のいずれかが超過した場合に、上のプランにあげるのでなく
追加で購入できるのはいいと思いました。
10,000Operations/人月もあれば、開発は可能な印象です。
![スクリーンショット 2020-10-18 7.48.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12362/44bc4421-c23f-bc8a-eb96-926cf615cb72.png)


https://www.integromat.com/en/pricing
より

![スクリーンショット 2020-10-18 7.56.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12362/879bc134-1265-b184-8f0e-43ef9ddcff3f.png)


# 参考URL

slack apiのrequestの検証仕様
https://api.slack.com/authentication/verifying-requests-from-slack

Webhookの仕様
https://support.integromat.com/hc/en-us/articles/360006249313-Webhooks

String関係の関数
https://support.integromat.com/hc/en-us/articles/360005771433-String-Functions