HOME › ユーザーガイド › 20.Teams設定 Salesforce側
導入手順(管理者向け)

20.Teams設定 Salesforce側

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)にアプリを登録#

  1. Azure Portal → Microsoft Entra ID → アプリの登録 → 新規登録
    • 名前: 任意(例 Task Relay Teams)
    • サポートされるアカウント: 通常「この組織ディレクトリのみ(単一テナント)」
    • リダイレクト URI: いったん空で可(手順2のコールバック URL を後で登録)
  2. 証明書とシークレット → 新しいクライアントシークレット を作成し、「値(Value)」をコピー
    • ⚠️ コピーするのは 「値」。「シークレット ID」ではない(間違えると後述 AADSTS7000215)。値は作成直後しか表示されないので必ず控える。
  3. API のアクセス許可 → アクセス許可の追加 → Microsoft Graph → 委任されたアクセス許可 で以下を追加:
    スコープ 用途 管理者同意
    openid profile email offline_access サインイン/リフレッシュ 不要
    User.Read 自分の情報 不要
    Team.ReadBasic.All チーム参照 場合により要
    Channel.ReadBasic.All チャネル参照 場合により要
    ChannelMessage.Read.All メッセージ受信(表示) 要
    ChannelMessage.Send 投稿・返信・リアクション 不要
    ChannelMessage.ReadWrite メッセージの編集・削除 要
    TeamMember.Read.All @メンション候補(メンバー一覧) 要
    Files.ReadWrite.All ファイル添付・受信画像のインライン表示 要
    OnlineMeetings.ReadWrite Teams 会議の作成 要
  4. 追加後、「<テナント>に管理者の同意を与える」 をクリック(管理者アカウントで実施)。
    • ⚠️ 管理者同意は「既存の発行済みトークン」には遡って効きません。 後からスコープを足したら、 利用者は必ず 手順6の再認証(無効化→アクセスを許可) をやり直すこと。
  5. アプリケーション(クライアント)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#

  1. Setup → クイック検索 「認証プロバイダ」 → 新規
  2. プロバイダタイプ: 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 のまま。
    • デフォルトの範囲(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
  3. 保存後に表示される コールバック 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)#

  1. Setup → 「指定ログイン情報」 → タブ 「外部ログイン情報」 → 新規
    • ラベル/名前: MSGraph
    • 認証プロトコル: OAuth 2.0
    • 認証フロータイプ: Authorization Code(認可コード)
    • スコープ: 手順2のデフォルトの範囲と同じ文字列
  2. プリンシパル を追加:
    • 種別: ユーザーごと(Per User) ← 委任のため必須
    • 名前: MSGraphOAuth
    • ※ namespace org(CMRelay)では外部ログイン情報名が CMRelay__MSGraph になり、 権限セットの参照は CMRelay__MSGraph-MSGraphOAuth。

3-2. 指定ログイン情報(Named Credential)#

  1. タブ 「指定ログイン情報」 → 新規
    • ラベル/名前: MSGraph(namespace org では保存後 CMRelay__MSGraph。Apex は callout:MSGraph で解決)
    • URL: https://graph.microsoft.com
    • 外部ログイン情報: MSGraph
    • 「コールアウトに対応」= オン
    • 「認証ヘッダーを生成」= オン

4. 【Salesforce側】リモートサイト(受信画像のインライン表示用)#

受信した 画像添付をパネル内にサムネイル表示 する機能は、Graph の driveItem/content が SharePoint の事前認証済みダウンロード URL へ 302 リダイレクト する仕様のため、その SharePoint ホストを許可する必要があります。

  1. リポジトリの remoteSiteSettings/Teams_SharePoint(https://creatorsmatch.sharepoint.com)をデプロイ、 または Setup → 「リモートサイトの設定」→ 新規 で登録。
  2. ⚠️ 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 へサインインしてトークンを(再)発行します。

  1. 右上アバター → 設定 → 個人設定 → クイック検索 「外部システムの認証設定」(または「外部ログイン情報」)
  2. MSGraph の行 → 「アクセスを許可」 → Microsoft サインイン+同意
  3. スコープを後から追加した場合は、先に 「無効化」→ もう一度「アクセスを許可」 で 再認証(同意内容が更新される)
    • ⚠️「アクセスを許可」で「管理者の承認が必要」と出る=そのスコープが 管理者同意待ち(【Microsoft側】手順1-4 未実施)。

これにより 投稿・リアクション・編集・削除はすべて本人名義 になります。


7. アプリでの動作(チャネル接続と機能)#

  1. Teams タブを開く → チャネルのリンク(Teams で対象チャネルの「…」→「チャネルへのリンクを取得」)を貼り付けて接続
    • リンクから groupId(=TeamId) と channelId(19:…@thread.tacv2) を抽出して TeamsChannelSetting__c に保存
    • チーム全体のリンク(/l/team/…)を貼った場合は General(一般)チャネル に紐付く
    • チャネルは プロジェクト単位・全ユーザー共有
  2. 使える機能:
機能 必要スコープ 備考
履歴表示・投稿・返信 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)+ teamsPanel/__tests__/teamsPanel.test.js(Jest)
  • 雛形(要 UI 実体化): externalCredentials/MSGraph / namedCredentials/MSGraph