リソースデータの変更に関する通知を設定する
Microsoft Graph APIでは、Webhook メカニズムを使用して、変更通知をクライアントに配信します。 クライアントは、変更通知を受信するように独自の URL を構成する Web サービスです。 クライアントアプリは、変更時に変更通知を使って状態を更新します。
Microsoft Graph はサブスクリプション要求を受け入れると、サブスクリプションで指定された URL に変更通知をプッシュします。 アプリはその後、そのビジネス ロジックに従ってアクションを実行します。 たとえば、詳細データのフェッチ、そのキャッシュやビューの更新などです。
既定では、変更通知には id
以外のリソース データは含まれません。 アプリでリソース データが必要な場合、アプリは Microsoft Graph API を呼び出して完全なリソースを取得することができます。 この記事では、変更通知をコントロールする例として ユーザー リソースを使用します。
アプリは、データにアクセスするために追加の API 呼び出しを行う必要がなくなるよう、リソース データを含む変更通知をサブスクライブすることもできます。 そようなアプリでは、そうした通知の要件 (具体的には、サブスクリプションのライフサイクル通知への応答、通知の真正性の検証、およびリソース データの解読) を満たすための追加のコードを実装する必要があります。 これらの通知を取り扱う方法の詳細については、「リソース データを含む変更通知を設定する」を参照してください。
サポートされているリソース
アプリは、表に示されている Microsoft Graph リソースの変更をサブスクライブできます。これは、リソースへのサブスクリプションに適用される制限も示します。 制限を超えると、サブスクリプションを作成しようとするとエラー応答が 403 Forbidden
発生します。 エラー応答の message プロパティは、超過した制限について説明します。
注:
アスタリスク (*) でマークされたリソースへのサブスクリプションは、エンドポイントでのみ使用できます /beta
。
リソース | サポートされているリソース パス | 制限事項 |
---|---|---|
クラウド印刷の printer | 印刷ジョブをダウンロードする準備ができたときに変更されます (jobFetchable イベント): /print/printers/{id}/jobs |
- |
クラウド印刷の printTaskDefinition | キューに有効なジョブがある場合の変更 (jobStarted イベント): /print/printtaskdefinition/{id}/tasks |
- |
OneDrive (個人用) の driveItem | 任意のフォルダーの階層内のコンテンツに対する変更:/users/{id}/drive/root |
- |
OneDrive for Business の driveItem | ルート フォルダーの階層内のコンテンツに対する変更: /drives/{id}/root 、/users/{id}/drive/root |
- |
group | すべてのグループに対する変更: /groups 特定のグループに対する変更: /groups/{id} 特定のグループの所有者に対する変更: /groups/{id}/owners 特定のグループのメンバーに対する変更: /groups/{id}/members |
最大サブスクリプションのクォータ: Azure AD B2C テナントではサポートされていません。 サブスクリプションの changeType に関する既知の問題。 |
SharePoint サイトのリスト | リスト内のコンテンツに対する変更:/sites/{site-id}/lists/{list-id} |
- |
Microsoft 365 グループ会話 | グループの会話に対する変更: groups/{id}/conversations |
- |
Outlook メッセージ | ユーザーのメールボックス内のすべてのメッセージに対する変更: /users/{id}/messages 、 /me/messages ユーザーの受信トレイ内のメッセージの変更: /users/{id}/mailFolders('inbox')/messages 、 /me/mailFolders('inbox')/messages |
すべてのアプリケーションに対して、メールボックスあたり最大 1,000 個のアクティブなサブスクリプションが許可されます。 |
Outlook イベント | ユーザーのメールボックス内のすべてのイベントに対する変更: /users/{id}/events 、 /me/events |
すべてのアプリケーションに対して、メールボックスあたり最大 1,000 個のアクティブなサブスクリプションが許可されます。 |
Outlook 個人用連絡先 | ユーザーのメールボックス内のすべての個人用連絡先に対する変更: /users/{id}/contacts 、 /me/contacts |
すべてのアプリケーションに対して、メールボックスあたり最大 1,000 個のアクティブなサブスクリプションが許可されます。 |
セキュリティの警告 | 特定のアラートに対する変更: /security/alerts/{id} フィルター処理されたアラートに対する変更: /security/alerts/?$filter={parameters} |
- |
Teams callRecord | すべての通話レコードを変更する: /communications/callRecords |
最大サブスクリプションのクォータ: |
Teams チャット | テナント内のすべてのチャットに対する変更: /chats 特定のチャットに対する変更: /chats/{id} |
最大サブスクリプションのクォータ: |
Teams chatMessage | すべてのチームのすべてのチャネルでチャット メッセージに対する変更: /teams/getAllMessages 特定のチャネルでのチャット メッセージの変更: /teams/{id}/channels/{id}/messages すべてのチャットでのチャット メッセージの変更: /chats/getAllMessages 特定のチャット内のチャット メッセージに対する変更: /chats/{id}/messages 特定のユーザーが含まれるすべてのチャット内のチャット メッセージに対する変更: /users/{id}/chats/getAllMessages |
最大サブスクリプションのクォータ: |
Teams チャネル | すべてのチームのチャネルに対する変更: /teams/getAllChannels 特定のチームのチャネルに対する変更: /teams/{id}/channels |
最大サブスクリプションのクォータ: |
Teams conversationMember | 特定のチームのメンバーシップの変更: /teams/{id}/members 特定のチームのすべてのチャネルのメンバーシップに対する変更: teams/{id}/channels/getAllMembers 特定のチャットでのメンバーシップの変更: /chats/{id}/members すべてのチャットのメンバーシップに対する変更: /teams/getAllMembers |
最大サブスクリプションのクォータ: |
Teams onlineMeeting * | オンライン会議の変更: /communications/onlineMeetings/?$filter=JoinWebUrl eq {joinWebUrl} |
|
Teams プレゼンス * | 1 人のユーザーのプレゼンスに対する変更: /communications/presences/{id} 複数のユーザー プレゼンスに対する変更: /communications/presences?$filter=id in ({id},{id}...) |
|
Teams チーム | テナント内の任意のチームに対する変更: /teams 特定のチームへの変更: /teams/{id} |
最大サブスクリプションのクォータ: |
todoTask | 特定のタスク リスト内のすべてのタスクに対する変更: /me/todo/lists/{todoTaskListId}/tasks |
- |
user | すべてのユーザーに対する変更: /users 特定のユーザーに対する変更: /users/{id} |
最大サブスクリプションのクォータ: outlook.com などの個人の Microsoft アカウントではサポートされていません。 Azure AD B2C テナントではサポートされていません。 サブスクリプションの changeType に関する既知の問題。 |
次のリソースは、リッチ通知 (リソース データを含む通知) をサポートしています。
- Teams チャット
- Teams chatMessage
- Teams チャネル
- Teams conversationMember
- Teams onlineMeeting *
- Teams プレゼンス *
- Teams チーム
サブスクリプション ライフタイム
サブスクリプションのライフタイムには制限があります。 アプリは、有効期限が切れる前にサブスクリプションを更新する必要があります。 そうしない場合、新しいサブスクリプションを作成する必要があります。 最長有効期限の一覧については、「リソースの種類別のサブスクリプションの最大の長さ」をご覧ください。
また、アプリはいつでも登録を解除して、変更通知の受信を停止できます。
サブスクリプションの管理
クライアントは、サブスクリプションを作成したり、サブスクリプションを更新したり、サブスクリプションを削除したりできます。
サブスクリプションの作成
リソースの変更通知の受信を開始するための最初の手順は、サブスクリプションを作成することです。 サブスクリプション プロセスは、次のようになります。
クライアントは、特定のリソースのサブスクリプション要求 (POST) を送信します。
Microsoft Graph が要求を確認します。
- 要求が有効な場合、Microsoft Graph は検証トークンを通知 URL に送信します。
- 要求が無効である場合、Microsoft Graph は、エラー コードと詳細の付いたエラー応答を送信します。
クライアントは、Microsoft Graph に検証トークンを返送します。
Microsoft Graph からクライアントに応答が送信されます。
クライアントは、サブスクリプションに変更通知を関連付けるために、サブスクリプション ID を格納する必要があります。
サブスクリプション要求の例
POST https://graph.microsoft.com/v1.0/subscriptions
Content-Type: application/json
{
"changeType": "created,updated",
"notificationUrl": "https://webhook.azurewebsites.net/notificationClient",
"resource": "/me/mailfolders('inbox')/messages",
"expirationDateTime": "2016-03-20T11:00:00.0000000Z",
"clientState": "SecretClientState"
}
プロパティの changeType
、notificationUrl
、resource
、および expirationDateTime
は必須です。 プロパティの定義と値については、「サブスクリプション リソースの種類」をご覧ください。
resource
プロパティは、変更の監視対象となるリソースを指定します。 たとえば、特定のメール フォルダーme/mailFolders('inbox')/messages
へのサブスクリプションを作成できます。または、管理者の同意によって指定されたユーザーの代わりに を作成できます。 users/john.doe@onmicrosoft.com/mailFolders('inbox')/messages
clientState
は必須ではありませんが、推奨される変更通知の処理プロセスに準拠するには含める必要があります。 このプロパティを設定すると、受け取る変更通知が Microsoft Graph サービスから来たものであることを確認することができます。 その理由で、このプロパティの値は機密として保たなければならず、使用はアプリケーションと Microsoft Graph サービスのためにのみ限るようにしてください。
処理が正常に終了すると、Microsoft Graph は 201 Created
コードおよび本文内に サブスクリプション オブジェクトを返します。
注:
notificationUrl プロパティに含まれるクエリ文字列パラメータは、通知が配信されるときに HTTP POST 要求に含まれます。
通知エンドポイントの検証
Microsoft Graph により、サブスクリプション作成の前にサブスクリプション要求の notificationUrl
プロパティの中で提供される通知エンドポイントが検証されます。 検証プロセスは、次のようになります。
Microsoft Graph は検証トークンをエンコードし、この検証トークンを通知 URL への POST 要求に含めます。
Content-Type: text/plain; charset=utf-8 POST https://{notificationUrl}?validationToken={opaqueTokenCreatedByMicrosoftGraph}
クライアントは、前の手順で提供された
validationToken
クエリ パラメーターを正しく URL デコードし、HTML/JavaScript があればそれをエスケープする必要があります。エスケープが推奨される理由は、悪意のある行為者は、クロスサイト スクリプティングの種類の攻撃に通知エンドポイントを利用できるためです。
一般的に、トークンの形式は多くの場合通知なしに変更できるため、検証トークンの値は不透明として扱ってください。 Microsoft Graph が HTML または JavaScript コードを含む値を送信することはありません。
クライアントは、手順 1 から 10 秒以内に次の特性を持つ応答を提供する必要があります。
- 状態コード
HTTP 200 OK
。 - コンテンツ タイプ
text/plain
。 - URL デコード済み検証トークンを含む本文。
validationToken
クエリ パラメーターで送信された同じ文字列を反映します。
クライアントは、検証トークンを応答で提供した後は、検証トークンを破棄する必要があります。
重要
クライアントがエンコードされた検証トークンを返した場合、検証は失敗します。
- 状態コード
さらに、Microsoft Graph Postman コレクションを使用して、エンドポイントが検証リクエストを適切に実装していることを確認できます。 Misc フォルダー内のサブスクリプションの検証リクエストは、エンドポイントによって提供される応答を検証する単体テストを提供します。
サブスクリプションの更新
クライアントは、要求時から最大 3 日間の特定の有効期限日を持つサブスクリプションを更新できます。 expirationDateTime
プロパティは必須です。
サブスクリプションの更新の例
PATCH https://graph.microsoft.com/v1.0/subscriptions/{id}
Content-Type: application/json
{
"expirationDateTime": "2016-03-22T11:00:00.0000000Z"
}
処理が正常に終了すると、Microsoft Graph は 200 OK
コードおよび本文内に サブスクリプション オブジェクトを返します。 サブスクリプション オブジェクトには、新しい expirationDateTime
値が含まれます。
サブスクリプションの削除
クライアントは、その ID を使用してサブスクリプションを削除することにより、変更通知の受信を停止できます。
DELETE https://graph.microsoft.com/v1.0/subscriptions/{id}
処理が正常に終了すると、Microsoft Graph は 204 No Content
コードを返します。
変更通知
クライアントがリソースの変更に関するサブスクリプションを行っている状態になると、リソースの変更が発生するたびに Microsoft Graph が通知 URL に POST
要求を送信するようになります。 created
など、サブスクリプションで指定されている種類の変更についてのみ通知が送信されます。
注:
同じリソースを監視する複数のサブスクリプションがクライアントにあり、これらのサブスクリプションで同じ通知 URL が使用されている場合、Microsoft Graph は 異なるサブスクリプションに対応する複数の変更通知を送信する場合があり、それぞれの通知では対応するサブスクリプション ID が表示されます。 その POST
要求のすべての通知が単一のサブスクリプションに属すものであるという保証はありません。
変更通知の例
このセクションでは、メッセージ作成に関する通知の例を示します。 ユーザーがメールを受信すると、Microsoft Graph は次の例に示すように変更通知を送信します。
通知は value
フィールドに表らせれるコレクションの中にあります。 通知ペイロードの詳細については、「changeNotificationCollection」を参照してください。
変更が多数発生した場合は、Microsoft Graph は異なるサブスクリプションに対応する複数の通知を同一の POST
要求で送信する場合があります。
{
"value": [
{
"id": "lsgTZMr9KwAAA",
"subscriptionId":"{subscription_guid}",
"subscriptionExpirationDateTime":"2016-03-19T22:11:09.952Z",
"clientState":"secretClientValue",
"changeType":"created",
"resource":"users/{user_guid}@{tenant_guid}/messages/{long_id_string}",
"tenantId": "84bd8158-6d4d-4958-8b9f-9d6445542f95",
"resourceData":
{
"@odata.type":"#Microsoft.Graph.Message",
"@odata.id":"Users/{user_guid}@{tenant_guid}/Messages/{long_id_string}",
"@odata.etag":"W/\"CQAAABYAAADkrWGo7bouTKlsgTZMr9KwAAAUWRHf\"",
"id":"{long_id_string}"
}
}
]
}
変更通知の処理
プロセスでは、受信したすべての変更通知が処理されることになっています。 変更通知を処理するためにアプリが実行する必要がある最小限のタスクは、次のようになります。
プロセスでは、受信したすべての変更通知が処理され、2xx クラス コードが送信されることになっています。 Microsoft Graph が 2xx クラス コードを 3 秒以内に受信しない場合、約 4 時間にわたって変更通知を何度も発行を試みます。その後、変更通知は中断され、配信されません。 プロセスが 3 秒以内に一貫して応答しない場合、通知は調整の対象になる場合があります。
処理に 3 秒以上かかると予想される場合は、通知を保持し、Microsoft Graph への応答で
202 - Accepted
の状態コードを返し、通知を処理する必要があります。 通知が保持されない場合は、5xx クラス コードを返してエラーを示すと、通知が再試行されます。3 秒未満で処理できると予想される場合は、通知を処理し、Microsoft Graph への応答で状態コード
200 - OK
を返します。 通知が正しく処理されない場合は、5xx クラス コードを返してエラーを示すと、通知が再試行されます。clientState
プロパティを検証します。 これは、サブスクリプション作成要求で当初送られた値に一致していなければなりません。注:
そうでない場合、これを有効な変更通知と見なすべきではありません。 変更通知が Microsoft Graph に由来するものでなく、悪意のある者が偽って送った可能性があります。 また、変更通知の送信元を調査し、適切なアクションを実行する必要があります。
ビジネス ロジックに基づいて、アプリケーションを更新します。
要求内の他の変更通知について、これらの手順を繰り返します。
調整
真正性を検証する前であっても、変更通知を受け取ったらすぐに状態コード 202 - Accepted
を送信します。 これは、変更通知の受信を確認し、不必要な再試行を防止することのみが目的です。 ほとんどのサブスクリプションでは、サービスでインシデントが発生していない限り、通知の発行中に追加の遅延の対象にはならず、すべての通知が SLA 内で配信されます。 ただし、サブスクリプション通知 URL が低速である場合や応答に失敗した場合は、サブスクリプションに関連付けられているホストへの通知が調整される可能性があります。 調整されたエンドポイントを調整するタイミングと処理方法を決定するには、次のプロセスを使用します。
通知は、3 秒のタイムアウトで HTTP クライアントを使用して発行されます。 結果に関係なく、通知の発行が完了すると、通知 URL に関連付けられたホストに対して、ネットワーク待機時間を含む発行の試行に費やされた合計時間が追跡されます。 発行時間が 2,900 ミリ秒を超える場合、応答は低速とみなされます。 応答はホストに累積され、低速応答の割合は 100 件の通知を受信した後に計算されます。 低速応答の割合が 10% に達すると、通知 URL に関連付けられたホストに低速エンドポイントとしてフラグが設定されます。 低速エンドポイントは通知 URL 内のホストに関連付けられているため、ホストに関連付けられているすべてのサブスクリプションへの通知はすべて評価対象であり、調整の対象であるとみなされます。
評価はリアルタイムで続行されます。 ホストの発行時間が 2,900ms を下回った場合、この低速でない応答は応答の合計数に含まれ、低速応答の割合が再計算されて、エンドポイントが再評価されます。 さらに、応答の蓄積は 10 分ごとにフラッシュされ、もう一度評価が開始され、エンドポイントを評価するまでの 100 件の通知を待機します。 したがって、ネットワーク待機時間や発行の遅延の一時的な急増は、遅延が軽減された後に修復されます。 2,900 ミリ秒を超える永続的なネットワーク待機時間や発行の遅延は、10 分ごとに継続的に再評価されます。
エンドポイントが調整されている間、次の追加の遅延が通知の対象になります。
- 通知は、失敗した通知と調整された調整された通知の一連のワーカーに自動的にオフロードされ、さらに 10 分の遅延が発生します。
- 調整されたエンドポイントの低速 % が 15% の場合、通知は >削除されます。
- HTTP 呼び出しの失敗によって配信に失敗した通知は、10 分後にもう一度再試行されます。
コード サンプル
GitHub では、次のコード サンプルを利用できます。
- Microsoft Graph トレーニング モジュール - Microsoft Graph で変更通知と変更履歴を使用する
- Node.js 用 Microsoft Graph Webhooks のサンプル
- ASP.NET 用 Microsoft Graph Webhooks のサンプル
- Java Spring 用 Microsoft Graph Webhooks のサンプル
ファイアウォール構成
オプションとして、通知 URL を保護するファイアウォールを構成して、Microsoft Graph からのインバウンド接続のみを許可することができます。 これにより、通知 URL に送信される無効な変更通知がさらされる可能性をさらに減らすことができます。 これらの無効な変更通知は、実装したカスタム ロジックをトリガーしようとしている可能性があります。 Microsoft Graph が変更通知を配信するために使用する IP アドレスの完全なリストについては、「Microsoft 365 の追加のエンドポイント」をご覧ください。
注:
変更通知の配信に使用される一覧に記載されている IP アドレスは、予告なしにいつでも更新できます。
遅延
次の表は、サービスで発生するイベントと変更通知の配信との間で予想される待ち時間を示しています。
リソース | 平均遅延時間 | 最大遅延時間 |
---|---|---|
警告 | 3 分未満 | 5 分 |
callRecord | 15 分未満 | 60 分 |
channel | 10 秒未満 | 60 分 |
チャット | 10 秒未満 | 60 分 |
chatMessage | 10 秒未満 | 1 分 |
contact | 不明 | 不明 |
会話 | 不明 | 不明 |
conversationMember | 10 秒未満 | 60 分 |
driveItem | 1 分未満 | 5 分 |
イベント | 不明 | 不明 |
グループ | 2 分未満 | 15 分 |
リスト | 1 分未満 | 5 分 |
メッセージ | 不明 | 不明 |
onlineMeeting | 10 秒未満 | 1 分 |
プレゼンス | 10 秒未満 | 1 分 |
printer | 1 分未満 | 5 分 |
printTaskDefinition | 1 分未満 | 5 分 |
team | 10 秒未満 | 60 分 |
[todoTask][] | 2 分未満 | 15 分 |
ユーザー | 2 分未満 | 15 分 |
注:
警告 リソースに指定された遅延時間は、警告自体が作成された後にのみ適用されます。 ルールがデータから通知を作成するのにかかる時間は含まれません。