7
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

この記事はWorkato Advent Calendar 2025 17日目の記事です。

NTT東日本 デジタル革新本部の内ヶ﨑です!

普段はWorkatoを活用しつつ社内システムの開発を担当しております。

さて、Workatoを活用したアカウント管理の自動化には様々なニーズがあるかと思います。

本日は、Workatoを利用してSlackのオーガナイゼーション内のユーザ一覧をadmin.users.list API経由で取得する際の注意点や実装例を紹介いたします。

※本記事の内容は2025年12月現在の情報に基づいています。仕様変更の可能性がありますので、最新情報は適宜公式ドキュメントをご確認ください。

想定読者

  • WorkatoのConnectorSDKを利用できる環境であり、あまり利用したことない方
    • ConnectorSDKを利用するため、社内のWorkato管理者の方に使用可否を確認頂くことをおすすめします
  • SlackのEnterprise Gridプランに加入している方
  • Workatoを活用してSlackのアカウント管理自動化を志向している方

実現したいこと

Slackのadmin.users.list APIを叩いてSlack Enterprise オーガナイゼーション内に登録されているユーザ一覧を取得したい!

誰がSlackのアカウントを保有しているかをWorkatoを活用して管理自動化することで、Slack管理者のアカウント管理にかかる稼働を削減させたい。がモチベーションになります。

前提知識

Slack Enterprise Gridプランって?

  • Slack Enterprise Gridは、大規模組織向けのSlackの最上位プラン
  • 複数のワークスペースを一元管理
  • セキュリティ・コンプライアンス・ガバナンスを強化

Slack ユーザ一覧取得APIについて

Slackにはユーザ一覧を取得するAPIとして、users.listとadmin.users.listが存在します。

  • users.list:ワークスペース内のユーザ一覧を取得
  • admin.users.list:組織として管理している全ワークスペースのユーザ一覧を取得

つまり、SlackのEnterprise Gridプランに加入している場合、全アカウント情報を取得する際にusers.listを利用するとワークスペース内のユーザしか取得できず、他ワークスペースに存在するユーザーを取得できない可能性があります。

Workato Slackコネクタの種類

Slack側のAPI要件が分かったところで、そもそもWorkatoのSlackコネクタにはどのような種類があるのか簡単にご紹介します。

1. Workbot for Slack

  • Slackのボットとして、複数のステップを含む承認ワークフローなど複雑なタスクを実行させたい時に利用
  • 事前にレシピやコマンドが事前に用意されているため、簡単にチャットボットを作成可能

2. Slack 公式コネクタ

  • Slackのワークスペースに対する操作をWorkatoで実現したい場合に利用
  • チャネルやグループ管理、チームメンバー追加を承認するレシピの作成などに利用

なお、1.と2.のコネクタの違いについては公式ドキュメントで詳しく記載されています。

3. HTTPコネクタ or ConnectorSDK 自作コネクタ

  • 上記コネクタでは権限不足等の理由で対応できないユースケースを実現したい場合に利用

実現方法

今回の実現したいことを考慮すると、以下の観点でWorkbot for SlackやSlack公式コネクタでは実現できないため、ConnectorSDKを利用してSlackコネクタを自作します。

  • Workbot for Slack:今回はボットを利用しないため不適
  • Slack公式コネクタ:「ワークスペースに対する操作」をサポートしており、オーガナイゼーションに対する操作は実現できないため不適

そのため、Slack側で連携用のAppを作成し、Workato側ではOAuth認証を用いてSlackと接続するConnectorSDKを作成します。

Slack App作成

1. OAuth & Permissions

  1. Slack Appを作成し、OAuth & Permissionsメニューを開きます

  2. admin.users:readは公式ドキュメントよりUser tokenでのみ利用できるので、最小権限の原則に則りUser token側にのみスコープを設定します

    User Token Scopesの設定

  3. Redirect URLsタブで、Workatoのcallback URLを設定します

    例:https://app.jp.workato.com/oauth/callback

2. Manage Distribution

  1. Manage Distributionメニューを開くと、チェック項目が表示されるので、問題ないか確認したうえでチェックをします

  2. すべてチェックすると「Activate Public Distribution」ボタンが有効化されるので、ボタンをクリックします

    Distribution

  3. Activateすると、「Add to Slack」ボタンが表示されるので、ボタンをクリックします

  4. Slack 組織オーナーである場合、画面右上にワークスペースを選択するウィジェットが現れるので、Organizationを選択します

    Organization選択

  5. admin.users:read権限をリクエストしていることを確認した上で、「許可する」をクリックします

    権限リクエスト画面

3. User OAuth Tokenのコピー

再度OAuth & Permissionsメニューを開き、User OAuth TokenをコピーすればSlack側の設定は完了です!

Workato 実装

ConnectorSDKでOAuth2.0認証のSlackコネクタを自作します。以下では注意点と実装例をご紹介します。

connection

fields:client_idやclient_secret、user_scopeを接続する際の入力パラメータに指定。

fields: [
    {
        name: 'client_id',
        optional: false,
        hint: 'Basic information > Client ID'
    },
    {
        name: 'client_secret',
        optional: false,
        control_type: 'password',
        hint: 'Basic information > Client Secret'
    },
    {
        name: 'user_scope',
        optional: false,
        hint: 'ex) users:read users:read.email admin.users:read'
    }
],

authorization

認証タイプはoauth2を選択。

type: "oauth2",

client_id: lambda do |connection|
    connection['client_id']
end,

client_secret: lambda do |connection|
    connection['client_secret']
end,

token_url: lambda do |connection|
    "https://slack.com/api/oauth.v2.access"
end, 

authorization_url:parameter指定はscopeとuser_scopeで動作が異なるため注意。今回はuser_tokenを利用するためuser_scope側のみ設定。

authorization_url: lambda do |connection|

    params = {
        client_id: connection["client_id"],
        scope: '',
        user_scope: connection["user_scope"],
    }.to_param
    
    "https://slack.com/oauth/v2/authorize?" + params
end,

acquire:出力はハッシュの配列であり形式が決められているため注意。responseの出力形式も確認。

acquire: lambda do |connection, auth_code|
    response = post("https://slack.com/api/oauth.v2.access").
        payload(
            grant_type: "authorization_code",
            code: auth_code,
            redirect_uri: "https://www.workato.com/oauth/callback"
        ).
        user(connection["client_id"]).
        password(connection["client_secret"]).
        request_format_www_form_urlencoded
    [ 
        {
            access_token: response["authed_user"]["access_token"],
            refresh_token: response["authed_user"]["refresh_token"],
            refresh_token_expires_in: response["authed_user"]["expires_in"]
        },
        nil,
        nil
    ]   
end,

refresh_on:再認証をトリガーするための配列です。この設定を誤るとトークンの再取得ができないため要注意。
また、Slack APIではHTTPステータスが200である場合でもok: falseが返ってくるケースがあり、処理が正常完了していないケースがあるため、その点についても要注意。

refresh_on: [
    /^\{"ok":false.+$/,
    /^\{"ok":false,"error":"token_expired".+$/,
    /^\{"ok":false,\"error":"token_expired".+$/
],

refreshrefresh_onでトリガーされた際に実行するAPIを定義。acquireのコードと類似箇所が多いがrefresh_token用に書き換えが必要。

refresh: lambda do |connection, refresh_token|
    response = post("https://slack.com/api/oauth.v2.access").
        payload(
            grant_type: "refresh_token",
            refresh_token: refresh_token,
            client_id: connection['client_id'],
            client_secret: connection['client_secret'],
        ).
        request_format_www_form_urlencoded
    [
        {
            access_token: response["access_token"],
            refresh_token: response["refresh_token"],
            refresh_token_expires_in: response["expires_in"] 
        },
        nil
    ]   
end,

actions

取得できるユーザ数は膨大である可能性が高いため、ページネーション用にcursorをInput Parameterに設定。

苦労点

Slack APIに精通していないこと、ConnectorSDKの経験が浅いことから以下の苦労点がありました。

1. Workato どのコネクタを利用するか

Slackと連携する際の選択肢が多かったため、どれを利用すれば稼働を最小化しつつユースケースを実現できるかで非常に迷いました。

どのコネクタでも言える事ですが、公式コネクタの場合はどのスコープが適用されているか、について確認してから利用を推奨します。

なお、私が試した限りではSlackについては公式コネクタのスコープ変更はできないようだったので、ユースケースとマッチしない場合はConnectorSDKやHTTPコネクタの活用を視野に入れるべきだと感じました。

2. admin.users.listをSlackで利用するためのApp設定

SlackAPIやAppの知見が浅いため、全ワークスペースを横断できるApp構築の必要性に気づき、作成するまで苦労しました。

今回はSlack管理者の方のご協力もあり、検証を重ねながらApp構築をすることができました。

3. Workato ConnectorSDKコーディング

ConnectorSDKのOAuth2.0認証実現例の公式ドキュメントはあるものの、上手く認証できなかったりrefresh_tokenの更新に失敗したりなど様々苦労しました。

どのアプリでも共通して言える解決策を見出すことはできませんでしたが、とにかくトライアンドエラーで実現まで何とか漕ぎ着けました。

今は環境によってはWorkato Connector Copilotがあるため、refresh_tokenの更新やresponseの内容確認などのトライアンドエラー、コネクタのひな形作成はCopilotに任せれば効率良く開発できそうです。

まとめ

SlackのEnterprise Gridプランの場合、API経由で全ユーザ一覧を取得するためにはいくつか通常とは異なるApp設定が必要という点を紹介しました。

個人的にはConnectorSDKでOAuth2.0認証を実現できたことが技術的に大きな知見となりました。

皆様のWorkato ConnectorSDK活用とSlack連携の加速化に貢献できれば幸いです。

※記載されている会社名、製品名、サービス名は、各社の商標または登録商標です。

参考

7
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?