Slackのボットトークン:場所と、xoxbとxoxpの違いを検証
Slackのボットトークンは、アプリのOAuth & PermissionsページにあるBot User OAuth Tokenで、xoxb-で始まります。アプリをインストールすると表示されます。取得の手順、SLACK_BOT_TOKENでの読み込み、xoxpのユーザートークン、xappのアプリレベルトークン、xoxeのローテーション、xoxcのセッショントークンとの違いをまとめました。
On this page
Slackのボットトークンは、アプリの OAuth & Permissions ページにある Bot User OAuth Token です。xoxb- で始まり、アプリ自身のボットユーザーとして動きます。表示されるのは、アプリをワークスペースにインストールしたあとだけです。手に入れるには、api.slack.com/apps でアプリを作り、OAuth & Permissions で chat:write などの Bot Token Scopes を追加し、Install to Slack をクリックして許可し、OAuth Tokens の欄からトークンをコピーします。たいていのコードは、SLACK_BOT_TOKEN という名前の環境変数からこれを読み込みます。
ユーザートークンは xoxp- で始まり、アプリを許可した人として動きます。Slackのドキュメントは、たいていのアプリにボットトークンをすすめています。インストールした人のアカウントが無効になっても動き続けるからです。同じアプリをファイルから設定するならアプリマニフェストの例を、localhostで自前のOAuthの流れからインストールするならlocalhostでのSlackのOAuthリダイレクトURLをご覧ください。
ユーザーにしかできないこともあります。たとえば、ボットには自分の在席状況があり、あなたの在席状況は変えられません。自分のSlackの点を緑に保つツール、たとえばSlack Greenがボットトークンではなくサインイン中のセッションを使うのはそのためで、その違いはSlackのxoxcとxoxdのトークンで説明しています。
2026年10月3日に、私たちのワークスペースでテスト用のアプリを作ってインストールし、2つのトークンを取得して実行し、そのあとアプリを削除しました。下のスクリーンショットと出力は、そのときのものです。
Slackのボットトークンを取得する方法
api.slack.com/appsを開き、Create New App、From scratch の順にクリックして、名前をつけ、ワークスペースを選びます。- OAuth & Permissions を開き、Bot Token Scopes を追加します。たとえば、投稿には
chat:write、人と在席状況を読むにはusers:readです。 - Install to Slack(古いページでは Install to Workspace)をクリックし、Allow をクリックします。新しいアプリに管理者の承認が必要なワークスペースもあります。
- 同じページの OAuth Tokens の欄から Bot User OAuth Token(
xoxb-...)をコピーし、秘密として保管します。コードや公開リポジトリには絶対に入れないでください。それでもリポジトリに入ってしまったら、トークンを無効にして再インストールします。再インストールだけでは同じトークンが返ってきます。 - ボットが投稿する必要のあるチャンネルに、ボットを招待します:
/invite @your-bot。招待しないと、パブリックチャンネルではnot_in_channel、プライベートチャンネルではchannel_not_foundで投稿が失敗します。
api.slack.com/apps のリンクは今、app.slack.com/app-settings/<ワークスペースID>/<アプリID>/oauth の設定を開きます。トークンは Copy ボタンつきのふつうのテキスト欄にあり、表示ボタンを押す手順もないので、画面が見える人なら誰でも読めます。このキャプチャでは私たちのトークンを隠しています。
このページは開くたびに同じトークンを表示するので、なくしたトークンはここに取りに戻れます。私たちのテストでは、スコープを変えずに Reinstall to Slack をクリックしても、同じ2つのトークンが返ってきました。
あとでスコープを追加したら、トークンがそのスコープを持つようにアプリを再インストールします。それまでは、新しいスコープが必要な呼び出しはmissing_scopeで失敗します。トークンの文字列そのものは変わりません。
試してみます。
curl -s -H "Authorization: Bearer $SLACK_BOT_TOKEN" https://slack.com/api/auth.test
ボットトークンは bot_id を返し、ユーザートークンは返しません。どちらを貼り付けたかを見分けるいちばん早い方法です。
xoxb- のトークンを最初に使う場面としてよくあるのは、CIの通知です。ビルドから投稿するワークフローのYAMLは、スレッドやメッセージの更新も含めてGitHub ActionsからSlackにメッセージを送る方法にあります。Pythonのスクリプトなら、トークンは slack_sdk の WebClient に渡します。スレッドへの返信と、間違いごとに返るエラーを試したスクリプトはPythonからSlackにメッセージを送るにあります。
実際のxoxbとxoxpのトークンの形
テスト用アプリの2つのトークンは、どちらも最初の数字が 11256386461409 で、これはアプリのクライアントIDの前半とも同じでした。ワークスペースの数字のIDです。残りの形は違っていました。
| ボットトークン | ユーザートークン | |
|---|---|---|
| 接頭辞 | xoxb- | xoxp- |
| 接頭辞のあとの部分 | 3つ: 14桁の数字が2つ、そのあと英数字24文字 | 4つ: 14桁の数字が3つ、そのあと16進数32文字 |
| 全体の長さ | 59文字 | 82文字 |
auth.test のuser | ボットユーザーの sgtokencheck(U0C798V2M88) | Allowをクリックした人、sieun |
auth.test のbot_id | B0C68LU08NP | なし |
ほとんどのコードが使う環境変数 SLACK_BOT_TOKEN からトークンを読む、Pythonの slack_sdk の例です。
import os
from slack_sdk import WebClient
client = WebClient(token=os.environ["SLACK_BOT_TOKEN"])
print(client.auth_test().data)
下の呼び出しは、2つのトークンと、2つの壊れたトークンで、本物のAPIに対して実行しました。
| 呼び出し | トークン | 結果 |
|---|---|---|
auth.test | xoxb | ok、bot_id あり |
auth.test | xoxp | ok、bot_id なし |
search.messages | xoxb | not_allowed_token_type |
search.messages | search:read のないxoxp | missing_scope |
人に対する users.info | どちらでも | ok |
auth.test | xoxb-123(作ったもの) | invalid_auth |
auth.test | トークンなし | not_authed |
アプリを削除したあとの auth.test | xoxb | account_inactive |
アプリを削除したあとの auth.test | xoxp | token_revoked |
つまり not_allowed_token_type は、そのメソッドがこの種類のトークンをそもそも受け付けないという意味です。どのスコープでも直らず、ユーザートークンが必要です。missing_scope は、トークンの種類は合っているけれど、アプリにそのスコープが与えられていないという意味です。
コードに漏れたSlackのトークンを探す
xoxp- を config.json、config.ini、settings.py、config.yml と一緒に検索する人がいるのは、トークンがそこに入ってしまうからです。プッシュする前に自分のリポジトリを確かめるなら、次のパターンは私たちのテスト用のファイルで、上のすべてのトークンの形に一致し、それ以外には一致しませんでした。
grep -rEnI "(xox[abpe]|xapp)[.-][0-9A-Za-z.-]{10,}" .
本物のトークンが見つかったら、その行を消すだけでなく、トークンを無効にしてください。トークンはgitの履歴に残っています。
Slackのトークンの種類と接頭辞
| 接頭辞 | トークン | 誰として動くか |
|---|---|---|
xoxb- | ボットトークン | アプリのボットユーザー |
xoxp- | ユーザートークン | アプリを許可したユーザー |
xapp- | アプリレベルトークン | すべてのインストールにまたがるアプリ |
xoxe.xoxb-、xoxe.xoxp- | ローテーションするアクセストークン | ボットかユーザー。12時間で期限切れ |
xoxe- | リフレッシュトークン | 新しいアクセストークンを得るのに使う |
xwfp- | ワークフロートークン | ワークフローのステップ。最大15分 |
xoxc-、xoxd- | Webクライアントのセッション | SlackのWebアプリとしてのあなた |
Slackのドキュメントには、App Manifest API用の設定トークンと、Deno Slack SDKで作ったアプリ用のサービストークンも書かれています。
xoxbとxoxpの違い
users.profile.set や、リファレンスにユーザートークンのスコープしか載っていない reminders.add です(それでもできることはSlackのリマインダーボットにあります)。ユーザートークンは、ユーザーが許可したユーザースコープも持っています。Slackのドキュメントには、ユーザートークンでの操作は、ユーザー本人が行ったように実行されるとあります。ボットトークンにはできません。私たちのas_userのテストでは、as_user=true をつけてもボットとして投稿されました。
xoxeのトークンとトークンのローテーション
アプリの設定でトークンのローテーションをオンにすると、oauth.v2.access は、43,200秒(12時間)で期限が切れる xoxe. の接頭辞のアクセストークンと、xoxe- で始まるリフレッシュトークンを返します。期限が切れる前に grant_type=refresh_token で oauth.v2.access を呼ぶと、新しい組が手に入ります。トークンのローテーションのテストでは、リフレッシュのあとにどの古いトークンが動き続けるか、そしてローテーションは一度オンにすると戻せないことを確かめています。
xappのアプリレベルトークン
アプリレベルトークンは xapp- で始まり、アプリの設定の Basic Information から作ります。メッセージの投稿ではなく、アプリ全体のAPIに使います。いちばん多いのはSocket Modeの接続です。
在席状況を設定できるトークンは?
users.setPresence は、呼び出したユーザーの在席状況を away か auto にします。ユーザートークンならそのユーザー自身の点が変わり、ボットトークンならボットの点が変わります。どのトークンでも、ユーザーを強制的にアクティブにはできません。コードと項目はSlackの在席状況APIのガイドにあります。
よくある質問
Slackのボットトークンには期限がありますか?
トークンのローテーションをオンにしない限りありません。オンにすると、アクセストークンは12時間で期限が切れ、リフレッシュが必要です。ローテーションなしの私たちのトークンは、アプリを削除するまで動き続けました。
xoxcとxoxdのトークンとは何ですか?
Webクライアントのセッショントークンと、そのCookieです。Slackのxoxcとxoxdのトークンをご覧ください。
Related Articles
How to See All Your DMs in Slack, Including the Hidden Ones
The DMs tab lists your direct messages with people. App DMs, Slackbot and DMs with deleted accounts sit elsewhere. We compared the tab with the full list the Slack API returned.
Slack Images Not Showing? 5 Causes We Reproduced
We uploaded images to a Slack test channel and then switched each image setting off, ran /collapse, and posted from a bot that was not in the channel. Five causes, each reproduced.
How to Message Yourself on Slack (and What It Notifies)
Your own name under Direct messages opens a private DM with yourself. We sent it a note, a file, a scheduled message and a reminder, and checked which ones raised a badge.