Skip to content

0.1.0 の認証マイグレーション

English | 한국어 | 日本語

ActivityPlug 0.1.0 は公開 API のセッション識別子を HTTP の Authorization ヘッダーでのみ受け付けます。ブラウザーアプリケーション は /v1/browser/** 境界と opaque cookie を使います。

必要な変更

クライアントや proxy をアップグレードする前に、各項目を完了してください。

  • HTTP、GraphQL、WebSocket リクエストの ActivityPlug セッション 識別子を Authorization: Bearer <session-id> に移す。
  • URL query parameter、GraphQL argument、GraphQL input object、 JSON body、multipart field から sessionId を削除する。
  • 識別子を WebSocket URL に入れず、WebSocket upgrade でもヘッダーを 使えるようにする。
  • ブラウザーコードで ActivityPlug セッション識別子を JavaScript に 公開せず、リクエストを /v1/browser/** に移す。
  • GET /v1/browser/session からブラウザー cookie と CSRF トークンを 取得する。
  • ブラウザーの mutation と認証リクエストで設定済み CSRF ヘッダーを 送信する。
  • access log、analytics、エラーレポート、保存済み URL にセッション 識別子が残っていないことを確認する。

query や body の資格情報に対する互換 alias はありません。これらの入力 を含むリクエストは無視されるのではなく拒否されます。

公開 HTTP リクエスト

0.1.0 より前:

http
GET /api/v1/timelines/home?sessionId=$ACTIVITYPLUG_SESSION HTTP/1.1
Host: proxy.example

0.1.0:

http
GET /api/v1/timelines/home HTTP/1.1
Host: proxy.example
Authorization: Bearer $ACTIVITYPLUG_SESSION

すべての HTTP JSON body と multipart body からトップレベルの sessionId フィールドを削除しました。このフィールドを含む body は拒否されます。

GraphQL と WebSocket のリクエスト

GraphQL HTTP リクエストは同じ Bearer ヘッダーを使い、argument と input object から sessionId を除きます。WebSocket upgrade も Bearer ヘッダーを使い、WebSocket URL 内の資格情報は拒否されます。

認証済み query、mutation、notificationStreamtimelineStream から sessionId argument を削除しました。post、media、poll、profile、 search、filter、list、mute、reaction に使う GraphQL input object からも 削除しました。削除済みフィールドのローカルコピーを維持せず、0.1.0 schema から typed client を再生成してください。

ブラウザーアプリケーション

ブラウザーアプリケーションは /v1/browser/** を使います。ActivityPlug セッション識別子を読み取ったり保存したりしないでください。

最初に GET /v1/browser/session を呼び出します。ActivityPlug は レスポンスで CSRF トークンを返し、Secure かつ HttpOnly の __Host-activityplug cookie を設定します。/v1/browser/auth/** で 認証を開始して完了し、その後 /v1/browser/api/** を使います。 ブラウザールートは Authorization 資格情報と sessionId query parameter の両方を拒否します。

サーバーとストアのチェックリスト

  • 公開トークン import は必要な場合だけ有効にし tokenImport.guard で保護する。
  • デプロイトポロジーに合う AuthSessionStore を選択する。
  • ブラウザー境界を有効にする場合は、ブラウザーセッション、OAuth state、チャレンジ、ストリームチケット、rate limit の各ストアを 設定する。
  • createActivityPlugServer() を呼び出す前に PostgreSQL の ライフサイクルテーブルを初期化する。
  • 複数プロセスが同じセッションを処理する場合は共有 PostgreSQL ストアまたは共有 Redis ストアを使う。
  • server.ready を待機し、backing database クライアントを閉じる 前に server.close() を呼び出す。

検証

認証済みの HTTP または GraphQL リクエストを 1 件以上、拒否される query 資格情報リクエストを 1 件、アプリケーションが使う WebSocket upgrade 経路を検証します。ブラウザーデプロイではセッション発行、CSRF 拒否、 認証完了、logout、consume 済み OAuth コールバックの replay 拒否も検証 します。

関連ドキュメント

Apache-2.0 OR MIT ライセンスで配布します。