認可(Authorization)
認可(Authorization)は、Slack からの受信リクエストを処理するにあたって、どのようなSlack クレデンシャル (ボットトークンなど) を使用可能にするかを決定する プロセスです。
単一のワークスペースにインストールされるアプリでは、token
パラメーターを使って App
のコンストラクターにボットトークンを渡すという、シンプルな方法が使えます。それに対して、複数のワークスペースにインストールされるアプリでは、次の 2 つの方法のいずれかを使用する必要があります。簡単なのは、組み込みの OAuth サポートを使用する方法です。OAuth サポートは、OAuth フロー用のURLのセットアップとstateの検証を行います。詳細は「OAuth を使った認証」セクションを参照してください。
よりカスタマイズできる方法として、App
をインスタンス化する関数にauthorize
パラメーターを指定する方法があります。authorize
関数から返される AuthorizeResult
のインスタンスには、どのユーザーがどこで発生させたリクエストかを示す情報が含まれます。
AuthorizeResult
には、いくつか特定のプロパティを指定する必要があり、いずれも str
型です。
bot_token
(xoxb)またはuser_token
(xoxp): どちらか一方が必須です。ほとんどのアプリでは、デフォルトのbot_token
を使用すればよいでしょう。トークンを渡すことで、say()
などの組み込みの関数を機能させることができます。bot_user_id
およびbot_id
:bot_token
を使用する場合に指定します。enterprise_id
およびteam_id
: アプリに届いたリクエストから見つけることができます。user_id
:user_token
を使用する場合に必須です。
import os
from slack_bolt import App
# AuthorizeResult クラスをインポートします
from slack_bolt.authorization import AuthorizeResult
# これはあくまでサンプル例です(ユーザートークンがないことを想定しています)
# 実際にはセキュアな DB に認可情報を保存してください
installations = [
{
"enterprise_id":"E1234A12AB",
"team_id":"T12345",
"bot_token": "xoxb-123abc",
"bot_id":"B1251",
"bot_user_id":"U12385"
},
{
"team_id":"T77712",
"bot_token": "xoxb-102anc",
"bot_id":"B5910",
"bot_user_id":"U1239",
"enterprise_id":"E1234A12AB"
}
]
def authorize(enterprise_id, team_id, logger):
# トークンを取得するためのあなたのロジックをここに記述します
for team in installations:
# 一部のチームは enterprise_id を持たない場合があります
is_valid_enterprise = "enterprise_id" not in team or enterprise_id == team["enterprise_id"]
if is_valid_enterprise and team["team_id"] == team_id:
# AuthorizeResult のインスタンスを返します
# bot_id と bot_user_id を保存していない場合、bot_token を使って `from_auth_test_response` を呼び出すと、自動的に取得できます
return AuthorizeResult(
enterprise_id=enterprise_id,
team_id=team_id,
bot_token=team["bot_token"],
bot_id=team["bot_id"],
bot_user_id=team["bot_user_id"]
)
logger.error("No authorization information was found")
app = App(
signing_secret=os.environ["SLACK_SIGNING_SECRET"],
authorize=authorize
)