mcpField
F
federation

federation

github.com/automattic開発58379 回インストール今日更新
リポジトリ

federation について

WordPress ActivityPub プラグインの開発者向けに、連合プロトコルを解説するスキルです。データモデル、配信、セキュリティ検証、OAuth クライアントの流れを扱います。

主な機能

  1. 01Actor・Activity・Object のモデル
  2. 02Inbox と Outbox の処理
  3. 03サーバー間の Activity 配信
  4. 04宛先指定と公開範囲の規則
  5. 05署名検証とコンテンツ安全性
  6. 06OAuth 2.0 クライアントの指針

活用シーン

  1. 01ActivityPub の連合機能の実装
  2. 02Activity 配信やフォロワー同期の調査
  3. 03送信元の検証と悪意あるコンテンツの除外

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/automattic/wordpress-activitypub --skill federation

インストール後、Claude Code で/federationを入力して読み込まれたか確認します。

詳細

ActivityPub フェデレーションプロトコル

このスキルでは、ActivityPub プロトコル仕様とフェデレーションの仕組みについて説明します。

サポートされている機能と互換性について: 実装済みの FEP、サポート対象の標準規格、フェデレーションの互換性に関する詳細な一覧は、FEDERATION.md を参照してください。

実装の詳細について: トランスフォーマー、ハンドラー、PHP コードのパターンについては、AGENTS.md を参照してください。

コアコンセプト

3 つの基本要素
  1. アクター - システム内のユーザー/アカウント

    • 各アクターは一意の URI を持ちます
    • 必須:inbox、outbox
    • 任意:followers、following、liked
  2. アクティビティ - アクターが行う操作

    • Create、Update、Delete、Follow、Like、Announce、Undo
    • 共有方法を示すためにオブジェクトをラップします
  3. オブジェクト - 操作の対象となるコンテンツ

    • ノート、記事、画像、動画など
    • 埋め込むことも、URI で参照することもできます
アクターの構造
{
  "@context": "https://www.w3.org/ns/activitystreams",
  "type": "Person",
  "id": "https://example.com/@alice",
  "inbox": "https://example.com/@alice/inbox",
  "outbox": "https://example.com/@alice/outbox",
  "followers": "https://example.com/@alice/followers",
  "following": "https://example.com/@alice/following",
  "preferredUsername": "alice",
  "name": "Alice Example",
  "summary": "Bio text here"
}

コレクション

標準コレクション

Inbox - 受信したアクティビティを受け取ります

  • アクティビティ ID に基づいて重複を排除します
  • 権限に基づいてフィルタリングします
  • 副作用を発生させるアクティビティを処理します

Outbox - アクターのアクティビティを公開します

  • アクターが投稿した内容の公開記録です
  • 閲覧者の権限に基づいてフィルタリングされます
  • プロフィールのアクティビティ表示に使用されます

Followers - このアクターをフォローしているアクター

  • Follow アクティビティが Accept されると更新されます
  • 配信先の決定に使用されます

Following - このアクターがフォローしているアクター

  • サブスクリプションを追跡します
  • タイムラインの構築に使用されます
公開アドレス指定

特別なコレクション:https://www.w3.org/ns/activitystreams#Public

  • コンテンツを公開してアクセスできるようにします
  • この URI には配信しないでください。実際の受信トレイではなく、マーカーです
  • 可視性を示すために to、cc、bto、bcc フィールドで使用されます

アクティビティの種類

Create

新しく公開されたコンテンツをラップします:

{
  "type": "Create",
  "actor": "https://example.com/@alice",
  "object": {
    "type": "Note",
    "content": "Hello, Fediverse!"
  }
}
Follow

サブスクリプションを開始します:

{
  "type": "Follow",
  "actor": "https://example.com/@alice",
  "object": "https://other.example/@bob"
}
  • 受信者は Accept または Reject で応答する必要があります
  • Accept された場合にのみ followers に追加します
Like

好意を示します:

{
  "type": "Like",
  "actor": "https://example.com/@alice",
  "object": "https://other.example/@bob/post/123"
}
Announce

コンテンツを再共有/ブーストします:

{
  "type": "Announce",
  "actor": "https://example.com/@alice",
  "object": "https://other.example/@bob/post/123"
}
Update

既存のコンテンツを変更します:

  • 指定されたプロパティで既存の値を置き換えます
  • null 値はフィールドを削除します
  • 元のオブジェクト ID を含める必要があります
Delete

コンテンツを削除します:

  • 参照整合性を保つため、Tombstone に置き換える場合があります
  • 関連するアクティビティにも削除を適用する必要があります
Undo

以前のアクティビティを取り消します:

{
  "type": "Undo",
  "actor": "https://example.com/@alice",
  "object": {
    "type": "Follow",
    "id": "https://example.com/@alice/follow/123"
  }
}

サーバー間フェデレーション

アクティビティの配信プロセス
  1. 受信者を解決する

    • to、bto、cc、bcc、audience フィールドを確認します
    • コレクションの参照をたどり、個々のアクターを特定します
    • 受信者リストの重複を排除します
    • アクティビティのアクター自身を除外します
  2. 受信トレイを検出する

    • アクターのプロフィールを取得します
    • inbox プロパティを抽出します
    • 効率化のため、利用可能な場合は sharedInbox を使用します
  3. HTTP POST で配信する

    • Content-Type:application/ld+json; profile="https://www.w3.org/ns/activitystreams"
    • 認証用に HTTP Signatures を含めます
    • 配信に失敗しても適切に処理します
受信トレイの転送

ゴースト返信の問題: Alice が、Carol がフォローしている Bob の投稿に返信しても、Carol が Alice をフォローしていない場合、Carol はその返信を見られないことがあります。

解決策: 受信トレイの転送

  • ローカルコレクション宛てのアクティビティを受信したとき
  • アクティビティがローカルオブジェクトを参照している場合
  • コレクションのメンバーに転送します
  • 会話の参加者が返信を見られるようにします
共有受信トレイの最適化

同じサーバー上に多数の受信者がいる公開投稿の場合:

  • 個々の受信トレイの代わりに sharedInbox エンドポイントを使用します
  • HTTP リクエスト数を削減します
  • サーバーが内部で配信します

アドレス指定と可視性

To/CC フィールド
  • to - 主な受信者(UI 上で公開)
  • cc - 副次的な受信者(コピー/メンション)
  • bto - 非公開の主な受信者(配信時に非表示)
  • bcc - 非公開の副次的な受信者(配信時に非表示)

重要: プライバシーを保護するため、配信前に bto と bcc を削除してください

可視性のパターン

公開投稿:

{
  "to": ["https://www.w3.org/ns/activitystreams#Public"],
  "cc": ["https://example.com/@alice/followers"]
}

フォロワー限定:

{
  "to": ["https://example.com/@alice/followers"]
}

ダイレクトメッセージ:

{
  "to": ["https://other.example/@bob"],
  "cc": []
}

コンテンツの検証

セキュリティに関する考慮事項
  1. 送信元を確認する

    • 検証せずに、申告された送信元を信用しないでください
    • HTTP Signatures を確認してください
    • 参照されているオブジェクトの所有者がアクターであることを検証してください
  2. なりすましを防止する

    • Mallory が、Alice が何かを投稿したと主張する可能性があります
    • 副作用を伴う処理を行う前に、必ず検証してください
  3. レート制限

    • 再帰的な参照解決を制限してください
    • サービス妨害攻撃から保護してください
    • スパムフィルタリングを実装してください
  4. コンテンツのサニタイズ

    • ブラウザーで表示する前に HTML をクリーンアップしてください
    • メディアタイプを検証してください
    • 悪意のあるペイロードがないか確認してください

プロトコル拡張

サポートされている標準規格

実装済みの標準規格と FEP の完全な一覧は、FEDERATION.md を参照してください。以下が含まれます。

  • WebFinger - アクターの検出。
  • HTTP Signatures - リクエストの認証。
  • NodeInfo - サーバーのメタデータ。
  • 各種 FEP(Fediverse Enhancement Proposals)。
FEP(Fediverse Enhancement Proposals)

FEP は ActivityPub を拡張し、追加機能を提供します。一般的な FEP のカテゴリには以下が含まれます。

  • 長文テキストのサポート。
  • 引用投稿。
  • アクティビティインテント。
  • フォロワーの同期。
  • アクターのメタデータ拡張。

このプラグインでサポートされている FEP: 実装済み FEP の正式な一覧は、FEDERATION.md を参照してください。

OAuth 2.0 クライアント間通信

ActivityPub API オプションが有効になっている場合、サードパーティのクライアントは activitypub/1.0/oauth/ を介して OAuth 2.0 で認証できます。このプラグインは、RFC 7591 の動的登録、RFC 7636 の PKCE(S256 のみ。パブリッククライアントではデフォルトで必須)、および CIMD ドラフト(URL 形式の client_id。HTTPS が必須)をサポートしています。

RFC 8252 — ループバックリダイレクト URI

ネイティブアプリは、ローカルで開いたループバックポートで OAuth コールバックを受信します。RFC 8252 §7.3 / §8.3 に従い、http://127.0.0.1:{port}/{path} および http://[::1]:{port}/{path} 形式のリダイレクト URI は、ポートに柔軟性を持たせて受け入れられます(リクエスト時に任意のポートを使用できます)。互換性のため localhost も受け入れられますが、§8.3 では「推奨されません」とされています。

ループバックの許可が適用されるのは、リダイレクト URI の照合に限られます。予約済みであってもループバックではないアドレス(0.0.0.0、リンクローカルの 169.254.0.0/16、RFC1918 のプライベートアドレス範囲(10/8、172.16/12、192.168/16)など)はループバックとして扱われず、wp_safe_remote_get() を迂回することはありません。CIMD メタデータ URL には https:// を使用する必要があります。また、取得前にメタデータのホスト名を解決し、プライベート/予約済みアドレス範囲に該当しないことを検証します。開発環境であっても、ループバックの CIMD オリジンはサポートされません。

実装の詳細: includes/oauth/class-client.php(特にクラスの docblock と is_loopback())および FEDERATION.md の OAuth セクションを参照してください。

実装上の注意事項

WordPress プラグイン固有の情報

このプラグインは以下を実装しています。

  • アクターの種類:ユーザー、ブログ、アプリケーション
  • トランスフォーマー:WordPress のコンテンツを ActivityPub オブジェクトに変換します
  • ハンドラー:受信したアクティビティを処理します

実装の詳細については、以下を参照してください。

  • コード構成については AGENTS.md
  • 拡張方法については統合ガイド
フェデレーションのテスト
# Test actor endpoint
curl -H "Accept: application/activity+json" \
  https://site.com/@username

# Test WebFinger
curl https://site.com/.well-known/webfinger?resource=acct:[email protected]

# Test NodeInfo
curl https://site.com/.well-known/nodeinfo

よくある問題

アクティビティを受信できない
  • Inbox URL にアクセスできることを確認してください
  • HTTP 署名の検証を確認してください
  • Content-Type ヘッダーが正しいことを確認してください
  • ファイアウォールやセキュリティ機能によるブロックを確認してください
返信がフェデレーションされない
  • Inbox の転送が有効になっていることを確認してください
  • 宛先に関連するアクターが含まれていることを確認してください
  • inReplyTo が適切に設定されていることを確認してください
フォロワーの同期に関する問題
  • Follow に対する Accept アクティビティが送信されていることを確認してください
  • フォロワーコレクションが更新されることを確認してください
  • 利用可能な場合は共有 Inbox が使用されていることを確認してください

Resources

コメント