# ATProto OAuth Comment System ATProtocol(Bluesky)のOAuth認証を使用したコメントシステムです。 ## プロジェクト概要 このプロジェクトは、ATProtocolネットワーク上のコメントとlangレコードを表示するWebアプリケーションです。 - 標準的なOAuth認証画面を使用 - タブ切り替えでレコード表示 - ページコンテキストに応じたフィルタリング ## ファイル構成 ``` src/ ├── config/ │ └── env.js # 環境変数の一元管理 ├── utils/ │ └── pds.js # PDS判定・API設定ユーティリティ ├── api/ │ └── atproto.js # ATProto API クライアント ├── hooks/ │ ├── useAuth.js # OAuth認証フック │ ├── useAdminData.js # 管理者データ取得フック │ └── usePageContext.js # ページ判定フック ├── services/ │ └── oauth.js # OAuth認証サービス ├── components/ │ ├── AuthButton.jsx # ログイン/ログアウトボタン │ ├── RecordTabs.jsx # Lang/Commentタブ切り替え │ ├── RecordList.jsx # レコード表示リスト │ ├── UserLookup.jsx # ユーザー検索(未使用) │ └── OAuthCallback.jsx # OAuth コールバック処理 └── App.jsx # メインアプリケーション ``` ## 環境設定 ### .env ファイル ```bash VITE_ADMIN=ai.syui.ai # 管理者ハンドル VITE_PDS=syu.is # デフォルトPDS VITE_HANDLE_LIST=["ai.syui.ai", "syui.syui.ai", "ai.ai"] # syu.is系ハンドルリスト VITE_COLLECTION=ai.syui.log # ベースコレクション VITE_OAUTH_CLIENT_ID=https://syui.ai/client-metadata.json # OAuth クライアントID VITE_OAUTH_REDIRECT_URI=https://syui.ai/oauth/callback # OAuth リダイレクトURI ``` ### 必要な依存関係 ```json { "dependencies": { "@atproto/api": "^0.15.12", "@atproto/oauth-client-browser": "^0.3.19", "react": "^18.2.0", "react-dom": "^18.2.0" } } ``` ## 主要機能 ### 1. OAuth認証システム **実装場所**: `src/services/oauth.js` - `@atproto/oauth-client-browser`を使用した標準OAuth実装 - bsky.social と syu.is 両方のPDSに対応 - セッション自動復元機能 **重要**: ATProtoのセッション管理は複雑なため、公式ライブラリの使用が必須です。 ### 2. PDS判定システム **実装場所**: `src/utils/pds.js` ```javascript // ハンドル判定ロジック isSyuIsHandle(handle) → boolean // PDS設定取得 getApiConfig(pds) → { pds, bsky, plc, web } ``` 環境変数`VITE_HANDLE_LIST`と`VITE_PDS`を基に自動判定します。 ### 3. コレクション取得システム **実装場所**: `src/api/atproto.js` ```javascript // 基本コレクション collections.getBase(pds, repo, collection) // lang コレクション(翻訳系) collections.getLang(pds, repo, collection) // → {collection}.chat.lang // comment コレクション(コメント系) collections.getComment(pds, repo, collection) // → {collection}.chat.comment ``` ### 4. ページコンテキスト判定 **実装場所**: `src/hooks/usePageContext.js` ```javascript // URL解析結果 { isTopPage: boolean, // トップページかどうか rkey: string | null, // 個別ページのrkey(/posts/xxx → xxx) url: string // 現在のURL } ``` ## 表示ロジック ### フィルタリング 1. **トップページ**: 最新3件を表示 2. **個別ページ**: `record.value.post.url`の rkey が現在ページと一致するもののみ表示 ### タブ切り替え - Lang Records: `{collection}.chat.lang` - Comment Records: `{collection}.chat.comment` ## 開発・デバッグ ### 起動コマンド ```bash npm install npm run dev # 開発サーバー npm run build # プロダクションビルド ``` ### OAuth デバッグ 1. **ローカル開発**: 自動的にloopback clientが使用される 2. **本番環境**: `client-metadata.json`が必要 ```json // public/client-metadata.json { "client_id": "https://syui.ai/client-metadata.json", "client_name": "ATProto Comment System", "redirect_uris": ["https://syui.ai/oauth/callback"], "scope": "atproto", "grant_types": ["authorization_code", "refresh_token"], "response_types": ["code"], "token_endpoint_auth_method": "none", "application_type": "web", "dpop_bound_access_tokens": true } ``` ### よくある問題 1. **セッションが保存されない** - `@atproto/oauth-client-browser`のバージョン確認 - IndexedDBの確認(ブラウザの開発者ツール) 2. **PDS判定が正しく動作しない** - `VITE_HANDLE_LIST`の JSON 形式を確認 - 環境変数の読み込み確認 3. **レコードが表示されない** - 管理者アカウントの DID 解決確認 - コレクション名の確認(`{base}.chat.lang`, `{base}.chat.comment`) ## API エンドポイント ### 使用しているATProto API 1. **com.atproto.repo.describeRepo** - ハンドル → DID, PDS解決 2. **app.bsky.actor.getProfile** - プロフィール情報取得 3. **com.atproto.repo.listRecords** - コレクションレコード取得 ## セキュリティ - OAuth 2.1 + PKCE による認証 - DPoP (Demonstration of Proof of Possession) 対応 - セッション情報はブラウザのIndexedDBに暗号化保存 ## 今後の拡張可能性 1. **コメント投稿機能** - 認証済みユーザーによるコメント作成 - `com.atproto.repo.putRecord` API使用 2. **リアルタイム更新** - Jetstream WebSocket 接続 - 新しいレコードの自動表示 3. **マルチPDS対応** - より多くのPDSへの対応 - 動的PDS判定の改善 ## トラブルシューティング ### ログ確認 ブラウザの開発者ツールでコンソールログを確認してください。主要なエラーは以下の通りです: - `OAuth initialization failed`: OAuth設定の問題 - `Failed to load admin data`: API アクセスエラー - `Auth check failed`: セッション復元エラー ### 環境変数確認 ```javascript // 開発者ツールのコンソールで確認 console.log(import.meta.env) ``` ## 参考資料 - [ATProto OAuth Guide](https://github.com/bluesky-social/atproto/blob/main/packages/api/OAUTH.md) - [BrowserOAuthClient Documentation](https://github.com/bluesky-social/atproto/tree/main/packages/oauth-client-browser) - [ATProto API Reference](https://docs.bsky.app/docs/advanced-guides/atproto-api)