Microsoft Teams
設定手順#
Teams タブで 実際にメッセージを送受信・リアクション・ファイル添付・会議作成 するための設定手順書です。 バックエンド(Apex TeamsService / TeamsChannelController / オブジェクト TeamsChannelSetting__c)と LWC(teamsPanel)は 実装・デプロイ済み(scratch org agility = agility-app-7700)。 残りは Entra ID(Azure AD)アプリ登録 と 認証プロバイダ+指定ログイン情報(Named/External Credential)「MSGraph」、 リモートサイト(SharePoint)、そして 各ユーザーの Microsoft サインイン同意 です。 (未設定の間は TeamsChannelSetting__c.Messages__c のデモ表示にフォールバックし、パネル下部に注記が出ます。)
Slack 連携との最大の違い:Slack は管理者が Bot トークンを1つ入れれば全員共有で使えました。 Teams は チャネル投稿がアプリ単独では不可(委任必須) のため、各ユーザーが初回に一度、 Microsoft へサインイン同意 する必要があります(ユーザー単位 OAuth)。
表記について:本書では画面の場所を 【Microsoft側】(Azure/Entra)と 【Salesforce側】 で明示します。 Salesforce の「名前付き資格情報」は、この組織の UI では 「指定ログイン情報」 と表示されます。
0. 全体像(何を・どこで設定するか)#
| # | 何を | どこで | 目的 |
|---|---|---|---|
| 1 | アプリ登録+API アクセス許可+管理者同意 | 【Microsoft側】Entra | 委任 OAuth の土台とスコープ |
| 2 | 認証プロバイダ MSGraph | 【Salesforce側】 | OAuth の入口。コールバック URL を発行 |
| 3 | 指定ログイン情報(External/Named Credential)MSGraph | 【Salesforce側】 | Apex が callout:MSGraph で Graph を叩く |
| 4 | リモートサイト Teams_SharePoint | 【Salesforce側】 | 受信画像インライン表示(SharePoint 追従) |
| 5 | 権限セット割当 | 【Salesforce側】 | CRUD/FLS/Apex/プリンシパルアクセス |
| 6 | 各ユーザーのサインイン同意 | 【Salesforce側】各自 | 委任トークン発行(投稿は本人名義) |
| 7 | チャネル接続 | アプリ(Teams タブ) | プロジェクト⇔チャネルの紐付け |
1. 【Microsoft側】Entra ID(Azure AD)にアプリを登録#
- → Microsoft Entra ID → アプリの登録 → 新規登録
- 名前: 任意(例
Task Relay Teams) - サポートされるアカウント: 通常「この組織ディレクトリのみ(単一テナント)」
- リダイレクト URI: いったん空で可(手順2のコールバック URL を後で登録)
- 名前: 任意(例
- 証明書とシークレット → 新しいクライアントシークレット を作成し、「値(Value)」をコピー
- ⚠️ コピーするのは 「値」。「シークレット ID」ではない(間違えると後述
AADSTS7000215)。値は作成直後しか表示されないので必ず控える。
- ⚠️ コピーするのは 「値」。「シークレット ID」ではない(間違えると後述
- API のアクセス許可 → アクセス許可の追加 → Microsoft Graph → 委任されたアクセス許可 で以下を追加:
スコープ 用途 管理者同意 openidprofileemailoffline_accessサインイン/リフレッシュ 不要 User.Read自分の情報 不要 Team.ReadBasic.Allチーム参照 場合により要 Channel.ReadBasic.Allチャネル参照 場合により要 ChannelMessage.Read.Allメッセージ受信(表示) 要 ChannelMessage.Send投稿・返信・リアクション 不要 ChannelMessage.ReadWriteメッセージの編集・削除 要 TeamMember.Read.All@メンション候補(メンバー一覧) 要 Files.ReadWrite.Allファイル添付・受信画像のインライン表示 要 OnlineMeetings.ReadWriteTeams 会議の作成 要 - 追加後、「<テナント>に管理者の同意を与える」 をクリック(管理者アカウントで実施)。
- ⚠️ 管理者同意は「既存の発行済みトークン」には遡って効きません。 後からスコープを足したら、 利用者は必ず 手順6の再認証(無効化→アクセスを許可) をやり直すこと。
- アプリケーション(クライアント)ID と ディレクトリ(テナント)ID をメモ。
段階導入の目安:最小構成(表示+投稿+返信+リアクション)は
openid profile email offline_access User.Read Team.ReadBasic.All Channel.ReadBasic.All ChannelMessage.Read.All ChannelMessage.Send。 そこに機能ごとにTeamMember.Read.All(@)/Files.ReadWrite.All(添付・画像)/OnlineMeetings.ReadWrite(会議)/ChannelMessage.ReadWrite(編集・削除)を足す。
2. 【Salesforce側】認証プロバイダ(Auth Provider)MSGraph#
- Setup → クイック検索 「認証プロバイダ」 → 新規
- プロバイダタイプ: Microsoft(または Open ID Connect)
- 名前 / URL サフィックス:
MSGraph - コンシューマ鍵: 手順1の クライアント ID
- コンシューマの秘密: 手順1の クライアントシークレットの「値」
- 認可エンドポイント:
https://login.microsoftonline.com/<テナントID>/oauth2/v2.0/authorize - トークンエンドポイント:
https://login.microsoftonline.com/<テナントID>/oauth2/v2.0/token- ※ Microsoft タイプだと
/common/が自動入力される。単一テナントならcommonを Tenant ID に置換。マルチテナントはcommonのまま。
- ※ Microsoft タイプだと
- デフォルトの範囲(Default Scopes): 手順1で足したスコープをすべて列挙。先頭に
openidを必ず含める(無いとId_Token_Error: Missing id_token)。openid profile email offline_access ChannelMessage.Read.All ChannelMessage.Send ChannelMessage.ReadWrite Team.ReadBasic.All Channel.ReadBasic.All TeamMember.Read.All Files.ReadWrite.All OnlineMeetings.ReadWrite User.Read
- 名前 / URL サフィックス:
- 保存後に表示される コールバック URL をコピー → 【Microsoft側】手順1のアプリ登録の 認証 → プラットフォームの追加 → Web に リダイレクト URI として登録。
- ⚠️ これを忘れると
AADSTS500113: No reply address is registered for the application。
- ⚠️ これを忘れると
3. 【Salesforce側】指定ログイン情報(External / Named Credential)MSGraph#
リポジトリに雛形をコミット済み(
externalCredentials/MSGraph/namedCredentials/MSGraph)。 External Credential(OAuth) は Auth Provider 作成後でないとデプロイできないため、UI 作成を推奨(作成後に retrieve で管理下へ)。
3-1. 外部ログイン情報(External Credential)#
- Setup → 「指定ログイン情報」 → タブ 「外部ログイン情報」 → 新規
- ラベル/名前:
MSGraph - 認証プロトコル: OAuth 2.0
- 認証フロータイプ: Authorization Code(認可コード)
- スコープ: 手順2のデフォルトの範囲と同じ文字列
- ラベル/名前:
- プリンシパル を追加:
- 種別: ユーザーごと(Per User) ← 委任のため必須
- 名前:
MSGraphOAuth - ※ namespace org(CMRelay)では外部ログイン情報名が
CMRelay__MSGraphになり、 権限セットの参照はCMRelay__MSGraph-MSGraphOAuth。
3-2. 指定ログイン情報(Named Credential)#
- タブ 「指定ログイン情報」 → 新規
- ラベル/名前:
MSGraph(namespace org では保存後CMRelay__MSGraph。Apex はcallout:MSGraphで解決) - URL:
https://graph.microsoft.com - 外部ログイン情報:
MSGraph - 「コールアウトに対応」= オン
- 「認証ヘッダーを生成」= オン
- ラベル/名前:
4. 【Salesforce側】リモートサイト(受信画像のインライン表示用)#
受信した 画像添付をパネル内にサムネイル表示 する機能は、Graph の driveItem/content が SharePoint の事前認証済みダウンロード URL へ 302 リダイレクト する仕様のため、その SharePoint ホストを許可する必要があります。
- リポジトリの
remoteSiteSettings/Teams_SharePoint(https://creatorsmatch.sharepoint.com)をデプロイ、 または Setup → 「リモートサイトの設定」→ 新規 で登録。 - ⚠️ SharePoint ホストはテナント固有(
<tenant>.sharepoint.com)。導入先ごとに各社の SharePoint ホストを登録すること。- 未登録の場合、画像は「リンク表示(クリックで SharePoint)」にフォールバックする(機能は壊れない)。
5. 【Salesforce側】アクセス権の付与(利用ユーザー)#
Teams はオプション機能扱いのため、CRUD/FLS/Apex クラスアクセスは
RelayOptionUser(TaskRelay Option User)権限セットへ統合済み(単体Teams_Accessは廃止)。
RelayOptionUser(TaskRelay Option User) …TeamsChannelSetting__cの CRUD/FLS +TeamsService/TeamsChannelControllerの Apex クラスアクセス。Teams タブ動作に必須。- 割当:
sf org assign permset -n CMRelay__RelayOptionUser -o agility - UI: Setup →「権限セット」→「TaskRelay Option User」→「割り当ての管理」→ ユーザー追加
- 割当:
- 外部ログイン情報プリンシパルアクセス … 権限セットで External Credential
MSGraphの プリンシパルMSGraphOAuthを有効化(これが個人設定に MSGraph を出す条件)。
6. 【Salesforce側・各自】サインイン同意(委任 OAuth)と再認証#
Teams タブを初めて使うユーザー、または スコープを追加した後 は、各自が Microsoft へサインインしてトークンを(再)発行します。
- 右上アバター → 設定 → 個人設定 → クイック検索 「外部システムの認証設定」(または「外部ログイン情報」)
MSGraphの行 → 「アクセスを許可」 → Microsoft サインイン+同意- スコープを後から追加した場合は、先に 「無効化」→ もう一度「アクセスを許可」 で 再認証(同意内容が更新される)
- ⚠️「アクセスを許可」で「管理者の承認が必要」と出る=そのスコープが 管理者同意待ち(【Microsoft側】手順1-4 未実施)。
これにより 投稿・リアクション・編集・削除はすべて本人名義 になります。
7. アプリでの動作(チャネル接続と機能)#
- Teams タブを開く → チャネルのリンク(Teams で対象チャネルの「…」→「チャネルへのリンクを取得」)を貼り付けて接続
- リンクから
groupId(=TeamId) とchannelId(19:…@thread.tacv2) を抽出してTeamsChannelSetting__cに保存 - チーム全体のリンク(
/l/team/…)を貼った場合は General(一般)チャネル に紐付く - チャネルは プロジェクト単位・全ユーザー共有
- リンクから
- 使える機能:
| 機能 | 必要スコープ | 備考 |
|---|---|---|
| 履歴表示・投稿・返信 | Read.All / Send / Channel・Team.ReadBasic | 本文+件名、スレッド返信、装飾(太字/斜体/箇条書き/番号/引用/コード)、表、絵文字 |
| @メンション候補 | TeamMember.Read.All | ↑↓キーで候補移動・Enter 確定 |
| ファイル添付 | Files.ReadWrite.All | チャネルの SharePoint へアップし reference 添付 |
| 受信画像インライン表示 | Files.ReadWrite.All + リモートサイト | 手順4。大きすぎる画像はリンク表示にフォールバック |
| Teams 会議作成 | OnlineMeetings.ReadWrite | 参加リンクをチャネルへ投稿(招待は送らない) |
| リアクション付与/取消 | ChannelMessage.Send | ホバーツールバー👍❤️😆😮+ピッカー。reactionType は絵文字文字を送る |
| メッセージ編集・削除 | ChannelMessage.ReadWrite | ホバーツールバーの編集/削除。トップレベル投稿が対象 |
8. トラブルシューティング(本セットアップで実際に遭遇したエラー)#
| 症状 / エラー | 原因 | 対処 |
|---|---|---|
AADSTS500113: No reply address is registered |
コールバック URL 未登録 | 【Microsoft側】アプリ登録 → 認証 → Web プラットフォームに Auth Provider のコールバック URL を追加 |
AADSTS7000215: Invalid client secret provided |
シークレットの ID を入れた | コンシューマの秘密に シークレットの「値」 を設定し直す |
Id_Token_Error: Missing id_token |
openid 不足 |
認証プロバイダの Default Scopes と External Credential の Scope 両方に openid を含める |
| サインインで「管理者の承認が必要」 | 管理者制限スコープの同意待ち | 【Microsoft側】該当スコープを追加し 管理者の同意 → 各自 再認証 |
Forbidden / 403(表示) |
ChannelMessage.Read.All 保護 API 未承認 |
Microsoft への申請/同意を確認 |
リアクション 400 Unicode 'like' not supported |
旧named型を送った | reactionType に 絵文字ユニコード(👍等)を送る(実装済) |
編集/削除 403 requires ChannelMessage.ReadWrite |
スコープ不足 | ChannelMessage.ReadWrite を追加+管理者同意+再認証 |
会議リンク参加時 AADSTS7000112: 'Microsoft Teams Web Client' is disabled |
テナントで純正アプリ「Microsoft Teams Web Client」(5e3ce6c0-…) が無効化 |
Task Relay とは無関係。デスクトップ Teams で参加、または【Microsoft側】管理者が当該エンタープライズアプリを「サインイン可」に有効化 |
| 「Teams 未設定…」注記が消えない | Named Credential 名 / スコープ / サインイン同意のいずれか | MSGraph 名・Scope・各自のアクセス許可を確認 |
401 Unauthorized |
トークン失効 | 個人設定でプリンシパル再サインイン |
9. (任意)チケットイベントの自動通知(委任に依存しない一方向通知)#
投稿の委任認証に依存せず「状況変更時に Teams へ通知」したい場合は、 TeamsChannelSetting__c.WorkflowWebhookUrl__c に Power Automate Workflows の Webhook URL を保存し、 チケットのトリガ/Flow から Adaptive Card を POST する(旧 Incoming Webhook は 2026/5/22 廃止のため Workflows 必須)。
関連コンポーネント(デプロイ済み: agility)#
- Apex
TeamsService: fetchMessages / sendMessage / replyToMessage / postReply / sendMessageWithAttachments / createMeetingAndPost / listUsers / fetchAttachmentImage(受信画像 data URL 化)/ setReaction・unsetReaction・editMessage・deleteMessage - Apex
TeamsChannelController: 設定保存・チャネルリンク解析(team/channel/groupId 抽出) - Object
TeamsChannelSetting__c: ProjectId__c / TeamId__c / ChannelId__c / ChannelName__c / WorkflowWebhookUrl__c / Messages__c(ja/en_US/zh_TW 翻訳済み) - LWC
teamsPanel: 実連携+失敗時デモfallback。件名/本文/装飾/表/絵文字/@メンション/添付/画像インライン/返信/会議/リアクション・編集・削除ツールバー - RemoteSiteSetting
Teams_SharePoint: 受信画像取得(テナント固有ホスト) - 権限セット: CRUD/FLS/クラスアクセス/プリンシパルアクセスは
RelayOptionUser(TaskRelay Option User)へ統合 - テスト:
TeamsServiceTest/TeamsChannelControllerTest(Assert クラス+@TestSetup 実 insert)+ (Jest) - 雛形(要 UI 実体化):
externalCredentials/MSGraph/namedCredentials/MSGraph

