Shifts custom WFM integrationを使ってMicrosoft TeamsのShiftsとWFMシステムを連携している管理者は、2026年4月のドキュメント更新を確認しておくべきです。今回のポイントは、暗号化されたリクエスト本文の扱い、C#/Pythonの復号サンプル、アプリ専用アクセス時の権限、スケジュール作成後のプロビジョニング待ちが明確になったことです。
特に影響が大きいのは、Shiftsからコネクタに送られるリクエストが単純な暗号文ではなく、Microsoft Bond CompactBinary形式のエンベロープとして扱われる点です。既存のコネクタで「復号処理を独自解釈している」「Graph APIの書き込み時に古いヘッダー前提で実装している」「スケジュール作成直後にスケジュールグループを作成している」場合は、設計とテストの見直しが必要です。Microsoft Learn上の該当ページはms.dateが2026年4月22日に更新され、GitHubの履歴では2026年4月23日にも関連コミットが確認できます。(GitHub)
Shifts custom WFM integrationの最新動向: 2026年4月更新で何が変わったか
Shifts custom WFM integrationは、Microsoft Teamsのスケジュール管理アプリであるShiftsと、外部のWFM(Workforce Management)システムをMicrosoft Graph API経由で同期するためのカスタム連携です。Microsoftの公式説明では、一方向同期と双方向同期のどちらにも対応できます。(Microsoft Learn)
今回の更新は、新機能の大規模リリースというよりも、実装者が迷いやすかった部分を公式ドキュメントとして具体化した改訂と見るのが適切です。とくに、既存連携を運用しているIT部門や、これからWFM連携を構築する開発チームにとっては、障害原因になりやすいポイントがかなり明文化されました。
| 更新ポイント | これまで起きやすかった問題 | 管理者・開発者が確認すべきこと |
|---|---|---|
| 暗号化リクエストの仕様が詳細化 | 共有シークレットや本文構造の解釈違いで復号に失敗する | 64文字シークレットの扱い、HMAC検証、Bond CompactBinaryのパースを確認する |
| C#/Pythonの復号サンプルが追加 | 実装チームごとに復号処理がばらつく | 公式サンプルをベースに単体テストを作る |
| 権限ガイダンスが更新 | アプリ専用アクセスで登録処理が通らない | Schedule.ReadWrite.AllとWorkforceIntegration.ReadWrite.Allの用途を分けて確認する |
| スケジュールプロビジョニングの注意点が追加 | スケジュール作成直後の後続処理で失敗する | provisionStatusがcompletedになるまで待つ |
| 読み取り専用・失敗応答の扱いが明確化 | 拒否したつもりの変更がShiftsに反映される | すべてのリクエストIDに対応する非200ステータスのレスポンスを返す |
まず押さえるべき結論
2026年4月更新後のShifts custom WFM integrationでは、次の4点を優先して確認してください。
既存コネクタは暗号化処理を再点検する
Shiftsからコネクタへ送られるリクエストは、AES-256-CBCとHMAC-SHA-256認証タグを使って暗号化されます。公式ドキュメントでは、共有シークレットはBase64としてデコードするのではなく、64文字のASCIIバイト列として扱うことが明記されています。さらに、HTTP本文はIV || ciphertext || HMACのような単純な連結ではなく、Microsoft Bond CompactBinaryエンベロープとして構成される点も説明されています。(Microsoft Learn)
この点を誤ると、以下のような障害が起きます。
/connectは呼ばれているのに復号できず、登録確認が失敗する/updateでHMAC検証に失敗し、ユーザーの変更承認が進まない- 本番環境では一部のリクエストだけ失敗し、原因調査が長引く
暗号化処理は「動いているように見える」状態でも、エンベロープの解釈が不完全だと将来のデータパターンで失敗する可能性があります。今回追加されたC#/Pythonサンプルを、既存実装との差分確認に使うのが現実的です。
アプリ専用アクセスの権限を整理する
今回の更新では、Microsoft Entra管理センターでのアプリ登録とMicrosoft Graph権限の説明もより実務向けになりました。Shifts APIでスケジュールデータを書き込むには、アプリ専用アクセスとしてSchedule.ReadWrite.Allアプリケーション権限を割り当てる説明があります。さらに、workforce integrationをプログラムから登録または更新する場合は、WorkforceIntegration.ReadWrite.Allアプリケーション権限が必要で、グローバル管理者による管理者同意が必要です。(Microsoft Learn)
「スケジュール更新はできるが、workforce integrationの登録だけ失敗する」というケースでは、後者の権限が不足している可能性があります。
スケジュール作成後はprovisionStatusを待つ
Teams上にチームとShiftsのスケジュールを作成したあと、すぐにスケジュールグループやメンバーを追加しようとして失敗することがあります。更新後の公式ドキュメントでは、スケジュールのプロビジョニングは非同期であり、スケジュールグループ作成前にprovisionStatusがcompletedになるまでポーリングする必要があると説明されています。(Microsoft Learn)
大規模な店舗展開や拠点展開では、この点がとくに重要です。数十〜数百チームを一括作成するスクリプトでは、固定の待機時間ではなく、状態確認ベースのリトライ設計にしましょう。
変更拒否のレスポンスを「HTTP 200+本文ステータス」で返す
Shifts custom WFM integrationでは、コネクタ側でユーザー操作を承認または拒否できます。ただし、単にHTTP 403やHTTP 500を返せばよいわけではありません。公式ドキュメントでは、統合からの応答はエラーを含めてHTTP 200 OKを返し、実際の承認・拒否状態はレスポンス本文のstatusとerrorで表すと説明されています。(Microsoft Learn)
さらに、今回の改訂では、受信したrequests配列の各idに対して対応するレスポンスが必要であり、不完全なレスポンスは暗黙の承認として扱われ、変更がShiftsに書き込まれる可能性がある点も明確化されました。(Microsoft Learn)
暗号化仕様の更新ポイントを実務目線で整理
今回の更新で最も技術的な影響が大きいのは、暗号化リクエストの詳細です。
Shiftsからコネクタに送られる/connectや/updateのリクエスト本文は暗号化されます。公式ドキュメントでは、復号時に注意すべき点として、共有シークレットの分割方法とHTTP本文の構造が説明されています。(Microsoft Learn)
64文字の共有シークレットはBase64デコードしない
共有シークレットは64文字ですが、これをBase64文字列として扱うのではなく、64 raw ASCII bytesとして扱います。前半32バイトがHMAC認証キー、後半32バイトがデータ暗号化キーをアンラップするためのKEKとして使われます。(Microsoft Learn)
実装レビューでは、次のようなコードがないか確認してください。
| 確認項目 | NG例 | 望ましい確認 |
|---|---|---|
| 共有シークレットの扱い | Base64デコードしてから使う | ASCIIバイト列として64バイトに変換する |
| キー分割 | 全体を暗号化キーとして使う | 先頭32バイトをHMACキー、後半32バイトをKEKとして分ける |
| エラー処理 | 復号失敗時に詳細ログなし | HMAC失敗、エンベロープ不正、パディング不正を区別して内部ログに残す |
ここで重要なのは、ログに共有シークレットや復号済みペイロードを出さないことです。障害調査では詳細ログが必要ですが、キーや個人情報を含むスケジュールデータを平文で残すと、セキュリティリスクが高まります。
HTTP本文はBond CompactBinaryエンベロープとして処理する
公式ドキュメントでは、HTTP本文は生のIV || ciphertext || HMAC連結ではなく、外側と内側のエンベロープ構造を持つと説明されています。外側はKeyIDとCiphertextを含み、内側はEK、IV、CT、ATを含む構造です。(Microsoft Learn)
このため、復号処理はおおまかに次の順序になります。
| 手順 | 処理 | 失敗時に疑う点 |
|---|---|---|
| 1 | HTTP本文から外側エンベロープをパースする | Bond CompactBinaryの読み取り実装ミス |
| 2 | 内側エンベロープからEK、IV、CT、ATを取り出す | フィールド順やblob長の解釈ミス |
| 3 | HMAC-SHA-256で認証タグを検証する | 共有シークレット、AAD、KeyIDの扱いミス |
| 4 | KEKでDEKをアンラップする | KEKの取り出し位置ミス |
| 5 | DEKとIVで本文をAES-256-CBC復号する | パディング、IV、暗号文の取り扱いミス |
既存の実装で「暗号化方式はAES-256-CBC-HMAC-SHA256だから、一般的なライブラリでまとめて処理できる」と単純化している場合は要注意です。今回のドキュメントは、フォーマットのパースも実装責任に含まれることを示しています。
C#/Pythonサンプル追加の意味
今回の更新では、C#とPythonの復号サンプルが追加されました。公式コミットの説明でも、暗号化セクションを拡張し、自己完結したC#/Pythonの参照実装を追加したことが説明されています。(GitHub)
これは、単にサンプルコードが便利になったというだけではありません。実務では、次の3つの使い方ができます。
既存実装の差分レビューに使う
すでにコネクタを運用している場合は、公式サンプルをそのまま本番投入するのではなく、既存コードとの比較に使うのが安全です。
確認すべき観点は以下です。
- 共有シークレットをASCIIとして扱っているか
- HMAC検証を復号前に行っているか
- 固定時間比較で認証タグを検証しているか
- Bond CompactBinaryのフィールドを期待通りに読めているか
- 例外発生時にHTTPレスポンスと内部ログの扱いが分離されているか
テストデータを作って単体テスト化する
復号処理は、UIテストや結合テストだけでは検出しにくい問題が多い領域です。今回のサンプルを参考に、次のような単体テストを作ると保守性が上がります。
| テストケース | 期待結果 |
|---|---|
| 正しい共有シークレットと本文 | 復号に成功する |
| 共有シークレットが63文字または65文字 | 入力エラーになる |
| 認証タグを1バイト変更 | HMAC検証で失敗する |
KeyIDが想定外 | 復号前に失敗する |
| 本文のblob長が不正 | パースエラーになる |
暗号化まわりは、本番障害になると切り分けに時間がかかります。デプロイ前に「失敗すべき入力で確実に失敗する」ことまで確認しておくべきです。
言語が異なる場合も仕様確認に使う
自社のコネクタがJava、Node.js、Goなどで実装されている場合でも、C#/Pythonサンプルは仕様確認用として有効です。とくに、バイト列の扱い、リトルエンディアン、HMAC対象データの順序は言語を問わず重要です。
実装言語が違う場合は、公式サンプルを「正」として、同じ入力に対して同じ復号結果が得られるかを確認するクロスチェックをおすすめします。
権限ガイダンスの更新で見るべきポイント
Shifts custom WFM integrationでは、Microsoft Graph APIを呼び出すアプリ登録と権限設計が欠かせません。今回の更新では、アプリ専用アクセスでの権限がより明確になりました。
Schedule.ReadWrite.AllはShiftsデータ操作の中心
WFMシステムからShiftsへシフト情報を書き込む場合、アプリはMicrosoft Graphを自分自身のIDで呼び出します。このとき、Schedule.ReadWrite.Allアプリケーション権限を使う説明があります。(Microsoft Learn)
この権限は強力です。スケジュール、シフト、休暇、オープンシフトなど、現場運用に直結するデータを扱うため、次の管理が必要です。
- 専用のアプリ登録を使い、他用途と混在させない
- クライアントシークレットや証明書の有効期限を監視する
- 本番用・検証用のアプリを分ける
- 管理者同意の履歴を残す
- Graph APIの呼び出しログを監査できるようにする
WorkforceIntegration.ReadWrite.Allは登録・更新用
workforce integration自体をプログラムから登録または更新する場合は、WorkforceIntegration.ReadWrite.Allアプリケーション権限も必要です。公式ドキュメントでは、この権限にはグローバル管理者の管理者同意が必要とされています。(Microsoft Learn)
ここは運用で混乱しやすい点です。シフトデータの更新と、workforce integrationの登録は別の操作です。権限不足で詰まった場合は、どちらのAPIを呼び出しているのかを分けて確認しましょう。
| 操作 | 主に必要な権限 | 確認すべき管理者ロール |
|---|---|---|
| アプリ登録 | Microsoft Entraでのアプリ登録権限 | Cloud Application Administrator以上 |
| Shiftsデータの読み書き | Schedule.ReadWrite.All | 管理者同意の有無 |
| workforce integrationの登録・更新 | WorkforceIntegration.ReadWrite.All | Global Administratorによる同意 |
| Graph Explorerでの対話的登録 | サインインユーザーの権限 | Global Administrator |
MS-APP-ACTS-AS前提の実装は見直す
今回のGitHubコミット説明では、関連ガイダンスの更新として、広く非推奨となったMS-APP-ACTS-ASヘッダー参照を削除したことが示されています。(GitHub)
既存の手順書や社内コードに、次のような記述が残っている場合は確認が必要です。
- 「チーム所有者のユーザーIDを
MS-APP-ACTS-ASに入れる」 - 「スケジュール更新時は特定ユーザーとして代理実行する」
- 「frontline managerを所有者に追加する理由がこのヘッダーのため」
現在の公式ガイダンスでは、アプリ専用アクセスと適切なアプリケーション権限を前提に整理されています。古い実装メモをそのまま使うと、権限設計が複雑になり、監査時の説明もしにくくなります。
一方向同期と双方向同期で注意点は変わる
Shifts custom WFM integrationでは、一方向同期と双方向同期のどちらを採用するかで実装上の重要ポイントが変わります。
一方向同期ではShiftsを読み取り専用にする
一方向同期では、WFMシステムを正とし、Shiftsにはスケジュールを表示するだけにします。この場合、ユーザーがShifts上で変更できてしまうと、WFMシステムとデータがずれます。
公式ドキュメントでは、一方向同期の場合、Shiftsを読み取り専用にするために、Shiftsからのリクエストに対して失敗レスポンスを返すと説明されています。拒否の例では、読み取り専用のような恒久的・ポリシー上の拒否には403、一時的なWFM到達不能には500のように、本文内のステータスを使い分ける考え方が示されています。(Microsoft Learn)
実務上は、次のように分けると分かりやすいです。
| 状況 | 返す本文ステータスの考え方 | ユーザーへの説明 |
|---|---|---|
| Shiftsでの変更を常に禁止 | 403 | 「シフト変更はWFMシステムで申請してください」 |
| WFMシステムが一時停止中 | 500または503相当 | 「現在処理できません。時間をおいて再試行してください」 |
| 対象ユーザーに権限がない | 403 | 「この操作は許可されていません」 |
| リクエスト内容が業務ルールに反する | 403または業務ルールに応じたエラー | 「勤務間インターバル不足」など具体的に通知する |
双方向同期では無限ループ防止が重要
双方向同期では、WFMシステムからShiftsへ書き込む変更と、Shiftsでユーザーが行った変更の両方を扱います。このとき問題になるのが、同じ変更を何度も処理してしまう無限ループです。
公式ドキュメントでは、WFMシステムからGraph APIでShiftsに書き込む際にX-MS-WFMPassthrough: workforceIntegratonIdヘッダーを含めることで、コネクタ側が「自分自身が起点の変更」と識別できると説明されています。(Microsoft Learn)
たとえば、WFMシステムがシフトを更新し、コネクタがGraph APIでShiftsに書き込むと、その書き込みも/updateを呼び出します。このとき、再びWFMシステムに同じ変更を書き戻すと、重複処理やループの原因になります。
実装では、次のルールを明文化してください。
- WFM起点のGraph書き込みには必ず
X-MS-WFMPassthroughを付ける - 同ヘッダー付きの
/updateは、WFMへ再適用せず承認だけ行う - Shifts起点の変更だけをWFM側の承認ロジックに渡す
- 定期同期では、Shifts起点で既に反映済みの変更を除外する
/connect、/update、/readの役割を整理する
Shifts custom WFM integrationのコネクタでは、主に/connect、/update、/readを実装します。公式ドキュメントでは、/connectと/updateが必須、/readが任意とされています。(Microsoft Learn)
| エンドポイント | 必須/任意 | 役割 | 実装時の注意 |
|---|---|---|---|
/connect | 必須 | workforce integration登録時の接続テスト | HTTP 200 OKを返せるか、暗号化本文を処理できるか |
/teams/{teamid}/update | 必須 | Shifts上の変更を承認・拒否する | WFMを正として検証し、本文ステータスで結果を返す |
/teams/{teamid}/read | 任意 | 休暇理由やシフト交換候補の絞り込み | 対応範囲やbeta API利用条件を確認する |
/readについては、2024年10月時点でMicrosoft Graph APIのbetaでのみサポートされる旨が公式ドキュメントに記載されています。利用する場合は、最新のGraph APIの状態を確認したうえで、検証環境で十分にテストしてください。(Microsoft Learn)
スケジュールとチーム作成時の実務チェックリスト
今回の更新では、スケジュール作成時の非同期プロビジョニングも重要な注意点です。TeamsとShiftsを大量展開する管理者は、特に確認しておきましょう。
展開前に決めること
| 項目 | 決める内容 | 例 |
|---|---|---|
| チーム単位 | WFM上のどの単位をTeamsのチームに対応させるか | 店舗、部署、拠点、業務ライン |
| 所有者 | frontline managersをチーム所有者にするか | 店長、現場責任者、シフト管理者 |
| メンバー | frontline workersをどう追加するか | Entra IDグループ、動的チーム、CSV連携 |
| スケジュールグループ | チーム内でどう分類するか | レジ、品出し、看護師、夜勤、キッチン |
| 同期範囲 | 初期同期で何日分を入れるか | 公式推奨に合わせて将来2週間分から開始 |
公式ドキュメントでは、初回同期ではWFMシステムからShiftsへ将来2週間分のデータを同期することが推奨されています。(Microsoft Learn)
スクリプト化する場合の順序
大規模展開では、次の順序で処理すると失敗を減らせます。
| 順序 | 処理 | 失敗しやすいポイント |
|---|---|---|
| 1 | Teamsのチームを作成または確認 | WFM側の組織単位と対応しない |
| 2 | 所有者とメンバーを追加 | frontline managerが所有者になっていない |
| 3 | Shiftsのスケジュールを作成 | 作成直後に後続処理を始めてしまう |
| 4 | provisionStatusを確認 | completed前にスケジュールグループ作成を実行する |
| 5 | スケジュールグループを作成 | 部署名・職種名のマッピングが不統一 |
| 6 | 従業員をグループに割り当て | ユーザーIDの対応付けミス |
| 7 | workforce integrationを有効化 | 対象スケジュールにIDを設定し忘れる |
| 8 | 初期同期を実行 | 過去データや重複データを投入する |
既存ユーザーが見直すべき5つのポイント
すでにShifts custom WFM integrationを使っている場合は、今回の更新を「新規構築者向けの情報」として流さないほうがよいです。既存環境でも、以下は確認対象になります。
復号処理が公式仕様と一致しているか
独自実装の復号処理がある場合は、公式サンプルと比較しましょう。特に、共有シークレットの扱い、HMAC対象データ、Bond CompactBinaryのパースは重点項目です。
失敗レスポンスが暗黙の承認になっていないか
requests配列に複数要素が含まれるケースでは、すべてのidに対応するレスポンスを返す必要があります。たとえばシフト交換の承認では複数の操作がまとめて届くことがあります。1件でもレスポンスが欠けると、意図せず承認扱いになる可能性があります。(Microsoft Learn)
古いヘッダー前提の手順が残っていないか
社内ドキュメント、構築手順書、IaC、CI/CDの設定にMS-APP-ACTS-AS前提の記述が残っていないか確認してください。今回の更新では、このヘッダー参照の削除が関連ガイダンスの更新点として示されています。(GitHub)
アプリ権限が最小限か
Schedule.ReadWrite.AllやWorkforceIntegration.ReadWrite.Allは強い権限です。用途別にアプリ登録を分離し、不要な権限を付与しない構成にしてください。
スケジュール作成後の待機処理が固定時間になっていないか
「30秒待つ」「1分待つ」といった固定待機は、テナントや負荷状況によって失敗します。provisionStatusを確認し、completedになるまで再試行する方式に変えるべきです。
ビジネスユーザーへの影響
今回の更新は開発者向けの技術文書に見えますが、現場部門や業務管理者にも関係します。
ShiftsとWFMシステムの連携では、どちらを正とするかが業務ルールに直結します。たとえば、WFMシステムを正とする一方向同期では、現場担当者がShifts上で変更しようとしても承認されない設計になります。一方、双方向同期では、Shifts上の変更申請をWFM側のルールで検証し、問題なければ反映できます。
現場への説明では、以下を明確にしておくと混乱を防げます。
| 現場からの質問 | 説明すべき答え |
|---|---|
| Shiftsでシフト変更できるのか | 一方向同期なら原則不可、双方向同期なら業務ルール次第 |
| 休暇理由が表示されないのはなぜか | WFM側の適格性フィルターや設定に依存する場合がある |
| シフト交換候補が少ないのはなぜか | WFM側のルールで交換可能なシフトだけが返される場合がある |
| エラーが出たとき誰に連絡するか | Teams管理者、WFM管理者、または店舗管理者の窓口を決めておく |
技術的にはコネクタの問題でも、利用者から見ると「Shiftsが使えない」という印象になります。障害時の問い合わせ導線を事前に決めておくことも、導入成功の一部です。
これから導入する場合のおすすめ進め方
これからShifts custom WFM integrationを導入する場合は、いきなり全拠点展開せず、次の順序で進めるのが安全です。
小さな対象で同期方式を決める
最初に、一方向同期か双方向同期かを決めます。判断基準は次の通りです。
| 判断軸 | 一方向同期が向くケース | 双方向同期が向くケース |
|---|---|---|
| WFMシステムの厳格性 | WFM以外での変更を許可しない | Shiftsからの申請も業務プロセスに組み込みたい |
| 現場の裁量 | シフト変更は管理者のみ | 現場が交換や休暇申請を行う |
| 実装難度 | 比較的低い | 承認・競合・ループ防止が必要 |
| 障害時の影響 | 表示遅延が中心 | 承認処理やデータ整合性に影響 |
初期導入では、一方向同期から始め、業務ルールが整理できた段階で双方向同期を検討する方法もあります。
検証環境で暗号化と権限を先に固める
TeamsやShiftsのUI調整よりも先に、/connect、/update、Graph API権限、暗号化復号を検証してください。ここが不安定なまま業務テストに入ると、現場テストの結果が信用できなくなります。
エラー時の表示とログを確認する
コネクタがHTTP 200 OKを返しつつ本文で失敗を返す設計は、一般的なAPI設計に慣れている開発者ほど間違えやすいポイントです。ユーザーにどう表示され、管理者ログには何が残るのかを、事前に確認しておきましょう。
管理者向けの実装・運用チェックリスト
最後に、2026年4月更新を踏まえた確認項目をチェックリストとして整理します。
| チェック | 確認内容 |
|---|---|
| 暗号化 | 64文字共有シークレットをASCIIとして扱っている |
| 暗号化 | HMAC検証を復号前に実施している |
| 暗号化 | HTTP本文をBond CompactBinaryエンベロープとしてパースしている |
| サンプルコード | C#/Python公式サンプルと既存実装の差分を確認した |
| 権限 | Shiftsデータ操作にSchedule.ReadWrite.Allを使う設計になっている |
| 権限 | workforce integration登録にWorkforceIntegration.ReadWrite.Allが必要か判断した |
| 管理者同意 | 必要なアプリケーション権限に管理者同意が付与されている |
| スケジュール | provisionStatusがcompletedになるまで待っている |
| 応答 | エラー時もHTTP 200 OKで本文ステータスを返している |
| 応答 | 受信した全idに対応するレスポンスを返している |
| 双方向同期 | X-MS-WFMPassthroughでループ防止している |
| 一方向同期 | Shifts側変更を本文ステータス403などで明示的に拒否している |
| 監査 | 共有シークレット、復号済み本文、個人情報をログに出していない |
| 運用 | 現場向けに「どこでシフト変更するか」を説明している |
まとめ: 2026年4月更新は「実装のあいまいさ」を減らす重要改訂
Shifts custom WFM integrationの2026年4月更新は、派手な新機能追加というより、コネクタ実装でつまずきやすい暗号化、サンプルコード、権限、プロビジョニング、レスポンス処理を具体化した重要な改訂です。
これから導入するチームは、公式サンプルを土台にして暗号化処理と権限設計を先に固めるべきです。すでに運用中のチームは、共有シークレットの扱い、Bond CompactBinaryのパース、WorkforceIntegration.ReadWrite.Allの必要性、provisionStatus待機、失敗レスポンスの完全性を見直してください。
次に取るべき行動はシンプルです。まず既存または予定中のコネクタ実装を棚卸しし、今回の更新ポイントに沿って「暗号化」「権限」「応答」「プロビジョニング」の4領域を点検しましょう。ここを先に整えることで、ShiftsとWFMシステムの連携を、現場にとって安定したスケジュール運用基盤として使いやすくできます。

コメント