V4 Webhook

Webhook とは

Webhook は、(新しいファイルでトランスコードが完了したとき、コメントが追加されたとき、プロジェクトが作成されたときなど)アカウントで何か興味深いことが発生するとすぐに Frame.io が起動する、プッシュスタイルの HTTP コールバックです。 API をポーリングする代わりに、パブリック HTTPS URL を指定します。Frame.io は、その URL に JSON ペイロードをリアルタイムで送信するので、次のことができます。

メタデータを外部 DAM/MAM に同期
Slack チャンネルまたはチケットシステムに入力

Webhook の詳細と機能について詳しくは、https://docs.webhook.site/ を参照してください。

エンドポイントの概要

操作エンドポイント詳細
Webhook の作成POST /v4/accounts/{account_id}/workspaces/{workspace_id}/webhooksnameurlevents[] を含んだ本文
ワークスペースのすべての webhook をリストGET /v4/accounts/{account_id}/workspaces/{workspace_id}/webhooksページネーションをサポートします
1 つの webhook の表示GET /v4/webhooks/{webhook_id}作成時にのみ署名シークレットを返します
Webhook の更新PATCH /v4/webhooks/{webhook_id}urlevents または is_active の変更
Webhook の削除DELETE /v4/webhooks/{webhook_id}配信をすぐに停止します

認証 — すべての V4 エンドポイントには、Adobe Developer Console を通じて取得された OAuth 2.0 アクセストークンが必要です。従来の開発者トークンおよび JWT は受け付けられません

Frame V4 の変更と更新

レガシーで作成された webhook は、次の変更で V4 に転送されます。

  1. ペイロード構造:アカウント ID をペイロードに追加しました
  2. エンドポイントの変更team_id は、JSON ペイロードでは提供されなくなりましたが、代わりに 次の URL のパスパラメーターにあります:https://api.frame.io/v4/accounts/:account_id/workspaces/:workspace_id/webhooks
  3. API 統合:API 構造、エンドポイント、および認証方法の変更により、リソースの強化および検索のために Frame.io API への後続の呼び出しを行う、受信 webhook の既存のコードは、更新が必要です
  4. イベントタイプ:アセット webhook は、個別のファイルおよびフォルダーイベントに分割されました。アセットイベントを含むレガシーからの webhook は、適切なファイルおよびフォルダーイベントを持つように更新する必要があります

移行後の webhook ステータス — アカウントが Frame.io V4 に移行されると、以前のバージョンの既存の webhook は自動的に無効になります。これにより、再アクティベートする前に webhook エンドポイントおよび統合ロジックを変更して、V4 のアップデートで作業できるようになります。V4 の互換性を得るように更新されていない webhook は、適切な変更をせずに有効にされた場合、エラーが発生します。どの webhook が非アクティブかを確認するには、API を通じて is_active フィールドを確認するか、webhook 設定を確認してから、オンに戻します。

Webhook イベントサブスクリプション

Webhook を作成および更新する場合は、関心のあるイベントを特定します。必要な数だけ選択します。イベント数を減らし、webhook を異なる命名スキームおよび異なるエンドポイントで論理的に分割すると、受信側でビジネスロジックをモデル化して、共有された機能でのフィルタリングおよびルーティングを減らすことができます。

イベントスコープ:すべてのイベントのスコープは、webhook の作成中に提供されるワークスペースに限定されます。つまり、そのワークスペース内のすべてのプロジェクトで実行されたアクションのイベントが送信されます。

プロジェクト

イベント説明
project.created新しいプロジェクトが作成されました
project.updatedプロジェクトの設定が更新されました
project.deletedプロジェクトが削除されました

ファイル

イベント説明
file.createdFrame.io にファイルが作成されました。*注意:*これは、ファイルのアップロードが完了する前にトリガーされます。ハンドラーが完全なファイルを必要とする場合、代わりに upload.completed イベントをリッスンすることをお勧めします
file.readyファイルがアップロードおよび処理された後、すべてのトランスコードが完了しました
file.updatedファイルの名前、または他の情報が変更されました
file.deleted(手動またはその他の方法で)ファイルが削除されました
file.upload.completedファイルがアップロードされました
file.versionedファイルバージョンが作成されました

フォルダー

イベント説明
folder.created新しいフォルダーが作成されました
folder.updatedフォルダーの設定が更新されました
folder.deletedフォルダーが削除されました

コメント

イベント説明
comment.created新しいコメントまたは返信が作成されました
comment.updatedコメントが更新されました
comment.deletedコメントが削除されました
comment.completedコメントが完了としてマークされました
comment.uncompletedコメントが未完了としてマークされました

メタデータ

イベント説明
metadata.value.updatedアセットのメタデータフィールドが更新されました

コレクション

イベント説明
collection.created新しいコレクションが作成されました
collection.updatedコレクションが更新されました
collection.deletedコレクションが削除されました

カスタムフィールド

イベント説明
customfield.created新しいカスタムフィールドが作成されました
customfield.updatedカスタムフィールドが更新されました
customfield.deletedカスタムフィールドが削除されました

共有

イベント説明
share.created新しい共有が作成されました
share.updated共有が更新されました
share.deleted共有が削除されました
share.viewed共有が表示されました

Webhook メッセージペイロード

すべての webhook ペイロードには、type フィールド(発生したイベントを示します)と resource オブジェクトが含まれています。resource オブジェクトには、イベントに関連する Frame.io リソースの typeID が含まれています。

ペイロードの例

1{
2 "account": {
3 "id": "6f70f1bd-7e89-4a7e-b4d3-7e576585a181"
4 },
5 "project": {
6 "id": "7e46e495-4444-4555-8649-bee4d391a997"
7 },
8 "resource": {
9 "id": "d3075547-4e64-45f0-ad12-d075660eddd2",
10 "type": "file"
11 },
12 "type": "file.ready",
13 "user": {
14 "id": "56556a3f-859f-4b38-b6c6-e8625b5da8a5"
15 },
16 "workspace": {
17 "id": "378fcbf7-6f88-4224-8139-6a743ed940b2"
18 }
19}

上記の file.created イベントの例では、resource.id は新しく作成されたファイルの ID を示します。さらに、workspaceproject、および user オブジェクトも含まれます。これらには、関連する workspace.idproject.id および user.id が含まれています。これらの値を使用して、受信イベントをフィルタリングしたり、キャッシュされたデータをローカルで検索したりすることで、API 呼び出しを減らすことができます。

アドビは、サブスクライブされたリソースに関するリソース ID 以外の追加情報は含めません

アプリケーションで追加情報やコンテキストが必要な場合は、API 呼び出しを行って、参照されているリソースに関する詳細情報を検索することをお勧めします。

セキュリティ

デフォルトでは、すべての webhook に署名キーがあります。この設定できない署名シークレットを使用して、リクエストが Frame.io から発生していることを確認できます。

設定した webhook のレスポンスペイロードには、この webhook に固有の署名シークレットが含まれます。このシークレットは、この初期 webhook 作成応答でのみ提供されるので、シークレットストレージまたは環境変数の安全な場所に保存してください。 後で使用して、webhook がアドビのサーバーから直接読み取られ、傍受や操作が一切行われていないことを確認してください。

Webhook 署名の確認

中間者攻撃や反射攻撃から統合を保護するには、wbhook ペイロードの署名を確認することが不可欠です。確認により、Webhook ペイロードが実際に Frame.io によって送信され、トランスポートでペイロードコンテンツが変更されていないことが確認されます。

POST リクエストには、次の HTTP ヘッダーも含まれます。

ヘッダー名説明
X-Frameio-Request-Timestampリクエストが送信されたタイムスタンプ1604004499
X-Frameio-Signature計算 webhook 署名v0=a77ce6856e609c884575c2fd211d07a9ad1c3f72e19c06ff710e8f086ffca883
user-agent: "Frame.io V4 API"v4 のヘッダーのユーザーエージェント
user-agent: "Frame.io Legacy API"レガシーのヘッダーのユーザーエージェント
Python
1import hmac
2import hashlib
3
4def verify_signature(curr_time, req_time, signature, body, secret):
5 """
6 Verify Webhook signature
7 :Args:
8 curr_time (float): Current epoch time
9 req_time (float): Request epoch time
10 signature (str): Signature provided by the Frame.io API for the given request
11 body (str): Webhook body from the received POST
12 secret (str): The secret for this Webhook that you saved when you first created it
13 """
14 if int(curr_time) - int(req_time) < 500:
15 message = 'v0:{}:{}'.format(req_time, body)
16 calculated_signature = 'v0={}'.format(hmac.new(
17 bytes(secret, 'latin-1'),
18 msg=bytes(message, 'latin-1'),
19 digestmod=hashlib.sha256).hexdigest())
20 if calculated_signature == signature:
21 return True
22 return False

タイムスタンプは、送信 webhook が送信されたときの、Frame.io のシステムからのシステム時間です。これは、リプレイ攻撃を防ぐために使用できます。この時刻が現地時間から 5 分以内であることを確認することをお勧めします。

署名は、Webhook が最初に作成されたときに提供された署名キーを使用する HMAC SHA256 ハッシュです。

署名を確認するには、次の手順に従います。

1

署名の抽出

HTTP ヘッダーから署名を抽出します。

2

署名するメッセージの作成

次のようにバージョン、配信時刻、およびリクエスト本文を組み合わせることで、署名するメッセージを作成します:v0:timestamp:body

3

HMAC SHA256 の計算

署名シークレットを使用して、HMAC SHA256 署名を計算します。

4

署名の比較

計算された署名を指定されたものと比較してください。

指定された署名には、接頭辞 v0= が付きます。現在、Frame.io で署名リクエスト用に用意されているのはこれだけです。この接頭辞が計算された署名の先頭に追加されていることを確認してください。

再試行とログ記録

再試行ポリシー
  • 合計 5 回の試行(最初 + 4 回の再試行)
  • 15 秒から開始される指数バックオフ(+ジッタ)
  • 2xx 以外のステータスまたは 5 秒を超えるタイムアウトにより、再試行がトリガーされます
障害ログ記録

Frame.io は、次を含んだ障害ログを保持します:webhook_id, account_id, event_type, resource_id, user_id

Webhook チュートリアル

手順 1:受信側の設定(URL を把握するために最初に実施します)

ここでは、webhook.site を使用しています。これにより、ペイロードの確認に使用できる、単回使用の webhook 受信者を簡単に作成し、実際のビジネスロジックなしで基本的な応答を送信できます。初めて https://webhook.site に移動すると、すぐにコピーして使用できる一意の webhook エンドポイントが作成されます。

この URL は、セッション固有です。

手順 1 の例

手順 2:サブスクライブするイベントの選択

このチュートリアルでは、シンプルにし、file.created イベントをサブスクライブするだけのためにこの webhook を設定します。Webhook 作成に使用する JSON ペイロードは、次のとおりです。

1{
2 "data": {
3 "name": "asset.created sample webhook",
4 "events": ["file.created"],
5 "url": "https://webhook.site/c05f2216-9558-4816-bc09-f77ee7b9de40"
6 }
7}

手順 3: Postman を使用して webhook リソースを作成

Postman を使用して、webhook リソースを作成する API 呼び出しを行い、ペイロードで webhook.site エンドポイントを提供します。

手順 4:テスト

Webhook サブスクリプションを作成し、webhook を受信するようにエンドポイントを設定したら、起動する原因となる適切なアクションを実行して最初の webhook をトリガーし、テストしてみましょう。

アドビのサンプルは file.created トリガーでトリガーするように設定されているので、先に進み、webhook が設定された対応するアカウントおよびワークスペース内の任意のプロジェクトに新しいアセットをアップロードしましょう。

手順 4 の例

その他のリソース