federation について
WordPress ActivityPub プラグインの開発者向けに、連合プロトコルを解説するスキルです。データモデル、配信、セキュリティ検証、OAuth クライアントの流れを扱います。
主な機能
- 01Actor・Activity・Object のモデル
- 02Inbox と Outbox の処理
- 03サーバー間の Activity 配信
- 04宛先指定と公開範囲の規則
- 05署名検証とコンテンツ安全性
- 06OAuth 2.0 クライアントの指針
活用シーン
- 01ActivityPub の連合機能の実装
- 02Activity 配信やフォロワー同期の調査
- 03送信元の検証と悪意あるコンテンツの除外
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ automattic/ wordpress-activitypub --skill federationインストール後、Claude Code で/federationを入力して読み込まれたか確認します。
詳細
ActivityPub フェデレーションプロトコル
このスキルでは、ActivityPub プロトコル仕様とフェデレーションの仕組みについて説明します。
サポートされている機能と互換性について: 実装済みの FEP、サポート対象の標準規格、フェデレーションの互換性に関する詳細な一覧は、FEDERATION.md を参照してください。
実装の詳細について: トランスフォーマー、ハンドラー、PHP コードのパターンについては、AGENTS.md を参照してください。
コアコンセプト
3 つの基本要素
-
アクター - システム内のユーザー/アカウント
- 各アクターは一意の URI を持ちます
- 必須:
inbox、outbox - 任意:
followers、following、liked
-
アクティビティ - アクターが行う操作
- Create、Update、Delete、Follow、Like、Announce、Undo
- 共有方法を示すためにオブジェクトをラップします
-
オブジェクト - 操作の対象となるコンテンツ
- ノート、記事、画像、動画など
- 埋め込むことも、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"
}
}
サーバー間フェデレーション
アクティビティの配信プロセス
-
受信者を解決する
to、bto、cc、bcc、audienceフィールドを確認します- コレクションの参照をたどり、個々のアクターを特定します
- 受信者リストの重複を排除します
- アクティビティのアクター自身を除外します
-
受信トレイを検出する
- アクターのプロフィールを取得します
inboxプロパティを抽出します- 効率化のため、利用可能な場合は
sharedInboxを使用します
-
HTTP POST で配信する
- Content-Type:
application/ld+json; profile="https://www.w3.org/ns/activitystreams" - 認証用に HTTP Signatures を含めます
- 配信に失敗しても適切に処理します
- Content-Type:
受信トレイの転送
ゴースト返信の問題: 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": []
}
コンテンツの検証
セキュリティに関する考慮事項
-
送信元を確認する
- 検証せずに、申告された送信元を信用しないでください
- HTTP Signatures を確認してください
- 参照されているオブジェクトの所有者がアクターであることを検証してください
-
なりすましを防止する
- Mallory が、Alice が何かを投稿したと主張する可能性があります
- 副作用を伴う処理を行う前に、必ず検証してください
-
レート制限
- 再帰的な参照解決を制限してください
- サービス妨害攻撃から保護してください
- スパムフィルタリングを実装してください
-
コンテンツのサニタイズ
- ブラウザーで表示する前に 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 が使用されていることを確認してください