先日社内Slack上のイベントを処理して業務改善を行うボットをSlackAppで作成しました。
簡単な処理のためGASと連携させて処理しましたが、たまにしか行わずchallenge認証のやり方を毎回忘れてしまうので備忘録として残します。
challenge認証とは
Event SubscriptionなどでSlack上のイベントをトリガーにして何かしら処理する場合、処理をリクエストするURLを事前に認証しておく必要があります。
Slackから以下のようなパラメータでPostリクエストが飛んでくるため、challengeパラメータをレスポンスで返してあげる必要があります。
{
"token": "xxxxxxxxxxxxx",
"challenge": "yyyyyyyyyyyyyyyyyyyyyyy",
"type": "url_verification"
}
challenge認証が正式な呼び方なのかは不明。
GASでの処理
最終的に以下のような形でchallengeパラメータを返してあげます。
function doPost(e) {
const params = JSON.parse(e.postData.getDataAsString());
if (params.type === 'url_verification') {
return ContentService.createTextOutput(params.challenge);
}
}
外部からのリクエストを処理するためウェブアプリケーションとしてGASを公開しますが、セキュリティの問題上、文字列をそのままreturnすることはできないようです。
GAS ウェブアプリケーションの条件
//これはエラーになります
return params.challenge;
なのでContentServiceクラスのcreateTextOutputメソッドを使ってTextOutputクラスのオブジェクトに変換してから返してやる必要があります。
TextOutputクラス
return ContentService.createTextOutput(params.challenge);