0.1.0 の認証マイグレーション
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 より前:
GET /api/v1/timelines/home?sessionId=$ACTIVITYPLUG_SESSION HTTP/1.1
Host: proxy.example0.1.0:
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、notificationStream、timelineStream から 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 拒否も検証 します。