大ちゃんの駆け出し技術ブログ

RUNTEQ受講生のかわいいといわれるアウトプットブログ

【Slack API】user scopeとbot scope

はじめに

こんにちは!大ちゃんの駆け出し技術ブログです。

最近になってようやく「Sign in with Slack」を実装できるようになったのですが、そこまで到達するのに必要なSlack API特有の知識があったのでそれについて紹介していこうかと思います。今回はその第一弾ということで、user scopeとbot scopeについて書いていきます!

今回の記事は基本的にはコードを書くということはありません。基本的には説明オンリーで話を進めていきます。

scopeとは

scopeというのは「範囲」という意味で理解している人が多そうですが、その意味を使うとSlack APIでのscopeは「権限の範囲」という意味になります。APIにどの程度アクセスすることができるかを決定するのがscopeです。

scope一覧から少し抜粋し説明します。

Scopes and permissions

例えば、チャンネルに投稿するというAPIの権限が欲しいのであれば、chat:writeという権限が必要になります。

https://i.gyazo.com/b14bf4397e70154f446ea445bbfe58b5.png

このscopeがあることで、チャンネルに投稿するためのAPIメソッドが利用可能になります。chat.postMessageメソッドはSlackに投稿するために必要なメソッドです。chat:writeの権限が付与されていることで初めて利用可能になります。

chat.postMessage Slack API Method

ちなみに、scopeによる権限は投稿に関わる権限となるため、投稿を更新するメソッドや削除するメソッドも利用可能になります。

chat.updateメソッド

chat.update Slack API Method

chat.deleteメソッド

chat.delete Slack API Method

このようにscopeがAPIの利用範囲を決定づけています。scopeの理解はSlack APIを利用する上でとても重要ですので、他の権限でもどういったメソッドが利用可能なのか今後紹介していけたらと思います。

User Scope

Slackはこのscopeの権限を付与する対象としてUserとBotを明確に区別しています。Userについての理解は簡単です。Slackを利用する私たちの情報にどれほどアクセスすることができるかという権限です。例えば、identity.basicというscopeはユーザのIDの情報を得ることができるusers.identityメソッドが利用可能になります。

users.identity Slack API Method

レスポンスとして返却されるJSON

{
    "ok": true,
    "user": {
        "name": "大ちゃん",
        "id": "U0G9QF9C6"
    },
    "team": {
        "id": "T0G9PQBBK"
    }
}

名前とユーザIDが返却されていますね。他にもユーザのアイコン画像へのアクセスやemailアドレスへのアクセスをするためのscopeがあります。

ユーザのscopeはユーザ情報を得るためのもの以外にもchat:writeのような投稿する権限なども一応設定できますが、基本的に利用頻度は少ないです。理由は権限を使わなくてもユーザがチャンネルに参加して投稿すれば言い訳ですので。ですので、基本的にはSlack アプリを作る上では、ユーザのscopeはユーザ情報へのアクセスをどの程度行うことができるかという理解で大丈夫だと思います。

Bot Scope

BotとはSlackアプリのBotのことです。Slack Botと言えば下記のアイコンをイメージする人が多いと思います。

https://livedoor.sp.blogimg.jp/joesbar/imgs/6/3/63f21d24.png

しかし、Botはこれだけでなくインストールしたアプリは全てBotになります。インストールしたアプリは下の画像のようにslack UIの左下に表示されると思います。

https://i.gyazo.com/a7fe0a1215c56dc49b62175d28aff59f.png

このアプリはメッセージを#generarlに投稿したり、他のチャンネルに投稿したりするかと思いますが、それはBotにscopeが付与されているためです。上述したようにchat:writeのような投稿する権限はユーザに必要ないということを説明しましたが、それはユーザが生きている人間で参加したり投稿したりを自由意志で行えるからです。アプリのBotにはそのような自由意志はなく、権限を与えなければ投稿などをさせることができません。このような違いからBotとUserで権限を分けているのです。

ちなみに2つの種類のscopeの見分け方ですがscope一覧の右列のtokenから確認できます。一覧にあるworkspaceとlegacyは昔使われていたらしいですが、今はほとんどは非推奨です。

https://i.gyazo.com/81e5cc2d1172fee6e7a160b1fc5954a0.gif

Scopes and permissions