Form to Wipe — n8n Deployment
このガイドは Form to Wipe の n8n 実装をカバーしています。Slack スラッシュコマンドを使用してモーダルを開き、リクエストを Slack DM 経由で承認者にルーティングし、Jamf Platform API 経由でイレースコマンドを送信します。承認者は Microsoft Entra、Okta、または Slack ユーザーグループからソースされます。
前提条件
- n8n セルフホスト(≥ 1.30)または n8n Cloud
- 必要なスコープを持つ Slack アプリ(下記ステップ 2 を参照)
- イレース権限を持つ Jamf Platform API OAuth2 クライアント(Form to Wipe を参照)
- 以下のいずれか: Microsoft Entra アプリ登録、Okta API トークン、または承認者向けの Slack ユーザーグループ
ステップ 1 — ワークフローをインポート
n8n で: Workflows → Import from file → Jamf-FTW-n8n-template.json を選択します。
ワークフローは非アクティブ状態でインポートされます。まだアクティブにしないでください — 認証情報と変数のセットアップを完了してください。
ステップ 2 — 認証情報
ワークフローを接続する前に、Settings → Credentials で以下の認証情報を作成してください。
Slack 認証トークン
api.slack.com/apps で Slack アプリを作成します。
OAuth & Permissions の Bot Token Scopes に以下を追加します。
スコープ 目的 commandsスラッシュコマンドを受け取る chat:writeDM およびチャネルメッセージを送信 chat:delete決定後に承認メッセージをクリーンアップ users:readID でユーザーを検索 users:read.emailメールでユーザーを検索(Okta/Entra パス) usergroups:readSlack ユーザーグループメンバーシップを読む views:openモーダルを開く views:update検証エラー時にモーダルを更新 ワークスペースにアプリをインストールして Bot User OAuth Token をコピーします。
n8n で: 新しい HTTP Bearer Auth 認証情報を作成し、トークンを貼り付け、
Slack Auth Tokenと名付けます。
Jamf Platform API
Jamf Pro で: Settings → API roles and clients → API Clients → New
Form to Wipe にリストされている権限を持つロールを割り当てます。
静的コンピュータグループについての注記: Platform API には、ネイティブな静的コンピュータグループメンバーシップエンドポイントがありません。ワークフローは Classic API プロキシ(
/api/proclassic/...)にフォールバックします。これは同じRead Computer Groups権限で対応されています。クライアントシークレットを生成し、クライアント ID とシークレットをメモします。
n8n で: 新しい OAuth2 API 認証情報を作成します。
- Grant type:
Client Credentials - Token URL:
https://YOUR_INSTANCE.jamfcloud.com/api/oauth/token - Client ID / Secret: 上記のもの
- Grant type:
Jamf Platform APIと名付けます。
API Gateway アクセス: ワークフローは Jamf Platform API Gateway(
apigw.jamf.com)も呼び出します。アクセス権がない場合は Jamf 担当者に連絡してください。
Okta API — IDP_PROVIDER = okta の場合のみ
- Okta で: Security → API → Tokens → Create Token
- n8n で: Okta ドメインとトークンを使用して新しい Okta API 認証情報を作成します。
Okta accountと名付けます。
Microsoft Entra — IDP_PROVIDER = entra の場合のみ
- Azure で: App registrations → New registration
- API 権限を追加:
GroupMember.Read.All(アプリケーションタイプ)と管理者同意を付与 - クライアントシークレットを作成
- n8n で: 新しい Microsoft Entra OAuth2 認証情報を作成します。
Microsoft Entra ID (Azure Active Directory) accountと名付けます。
ステップ 3 — 変数
Settings → Variables の下で n8n 内に各変数を作成してください。
必須変数
| 変数 | 説明 | 例 |
|---|---|---|
JAMF_TENANT_NAMES |
Jamf テナント用のカンマ区切り表示名 | Production,Staging |
JAMF_TENANT_IDS |
カンマ区切りテナント UUID — 名前と同じ順序 | aaaaaaaa-...,bbbbbbbb-... |
APPROVER_SOURCE |
承認者リストを取得する場所: scim、idp、または dev |
idp |
IDP_PROVIDER |
APPROVER_SOURCE=idp の場合に必須: entra または okta |
entra |
APPROVAL_TIMEOUT_SECONDS |
リクエストが期限切れになるまでの時間 | 3600 |
AUDIT_LOG_CHANNEL_ID |
すべての監査イベント用の Slack チャネル ID | C0123456789 |
WEBHOOK_VERIFY_TOKEN |
UUID またはランダムシークレット — Slack スラッシュコマンド URL にも設定 | your-secret-uuid |
承認者ソース別変数
APPROVER_SOURCE = scim の場合(Slack ユーザーグループ):
| 変数 | 値 |
|---|---|
APPROVER_USERGROUP_ID |
Slack ユーザーグループ ID — フォーマット: S0XXXXXXXX |
APPROVER_SOURCE = idp + IDP_PROVIDER = okta の場合:
| 変数 | 値 |
|---|---|
IDP_OKTA_GROUP_ID |
Okta グループ ID — フォーマット: 00gXXXXXX |
IDP_OKTA_SLACK_EMAIL_FIELD |
Slack メール検索に使用するプロフィールフィールド(通常は email) |
APPROVER_SOURCE = idp + IDP_PROVIDER = entra の場合:
| 変数 | 値 |
|---|---|
ENTRA_APPROVER_GROUP_ID |
承認者グループの Azure AD オブジェクト ID |
APPROVER_SOURCE = dev の場合(テスト用の代替 Slack ユーザーグループ):
| 変数 | 値 |
|---|---|
DEV_APPROVER_USERGROUP_ID |
開発/テスト承認者用の Slack ユーザーグループ ID |
マルチテナント構成
JAMF_TENANT_NAMES と JAMF_TENANT_IDS 変数は同じ順序である必要があります。名前のインデックス 0 が ID のインデックス 0 にマップされます。Slack モーダルのテナントドロップダウンは実行時にこれらの変数から動的に構築されます。追加のテナントごとの構成は必要ありません。
API Gateway リージョン: ワークフローはデフォルトで
us.apigw.jamf.comに設定されています。テナントが EU または APAC にある場合は、Find Group + Build Members URL と Determine Management Id Lookup URL コードノード内のREGION定数を更新してください。
ステップ 4 — Slack アプリセットアップ
スラッシュコマンド
- Slack アプリで: Slash Commands → Create New Command
- コマンド:
/device-wipe(または好みの名前) - Request URL:
https://YOUR_N8N_INSTANCE/webhook/jamf-device-wipe?token=YOUR_WEBHOOK_VERIFY_TOKEN - Short description:
Submit a Jamf device wipe request
インタラクティビティ
- Slack アプリで: Interactivity & Shortcuts → Turn On
- Request URL:
https://YOUR_N8N_INSTANCE/webhook/jamf-device-wipe?token=YOUR_WEBHOOK_VERIFY_TOKEN
スラッシュコマンドとインタラクティブコンポーネント(モーダル送信、ボタンクリック)の両方が、クエリパラメータとして検証トークン付きの 同じ webhook URL をポイントする必要があります。
ステップ 5 — アクティベート
- n8n でワークフローを開く
- 各ノードを認証情報に再リンク(n8n はインポート時に認証情報リンクをクリア)
- Activate をクリック
- Slack で
/device-wipeでテスト
フロー概要
/device-wipe (Slack)
→ Webhook → Verify Token → Parse Webhook
→ Switch on webhook type:
slash_command → Open Wipe Request Modal
view_submission → Parse Submission → Validate →
Resolve Device IDs → Send to Approval
approver_response → approve: LOG → Parse → Send Final Confirmation to Requestor
→ deny: LOG → DM Requestor
final_confirmation → confirm: LOG → Split per-device →
Send Erase Command × N →
Merge Results → DM Results → LOG
→ cancel: LOG → DM Requestor
timeout path → DM Requestor if no approval within APPROVAL_TIMEOUT_SECONDS
トラブルシューティング
モーダルが開かない
スラッシュコマンド Request URL に ?token=YOUR_WEBHOOK_VERIFY_TOKEN が含まれていることを確認します。トークンが一致しないリクエストは Verify Token ノードによって拒否されます。
承認者リストが空です
scim:APPROVER_USERGROUP_IDが正しいこと、および Slack アプリがusergroups:readを持つことを確認okta:IDP_OKTA_GROUP_IDが正しいこと、および Okta 認証情報がグループ読み取りアクセスを持つことを確認entra:ENTRA_APPROVER_GROUP_IDが正しいこと、および Entra アプリがGroupMember.Read.Allを持つことを確認
イレースコマンドが 4xx を返す Jamf Platform API 認証情報がイレース権限を持つことを確認し、正しい API Gateway リージョンを使用していることを確認します。
テナントドロップダウンにプレースホルダー値が表示される
ワークフローをアクティブにする前に JAMF_TENANT_NAMES と JAMF_TENANT_IDS 変数を設定してください。