codh-mirror に Firebase 認証と JSONkeeper 互換 API を後付けして IIIF Curation の編集ワークフローまで成立させる — 前回『動かない』と書いたところからの方針転換

暫定ミラー codh-mirror について、前回記事では『認証・保存バックエンドは結局動かない』としていたところを、後から方針転換して Firebase 認証と JSONkeeper 互換 API (Cloudflare Workers + D1 / PythonAnywhere の二系統) を実際に動かすまでの記録です。

codhiiiffirebasefirebaseuijsonkeepercloudflare-workerspythonanywheregithub-pagesmirrorarchive

台本(フルテキスト)

動画の掛け合いを書き起こしたものです。音声を再生しづらい場合はこちらをお読みください。

オープニング

  • codh-mirror に Firebase 認証と JSONkeeper 互換 API を後付け
  • 前回「動かない」としていた認証・保存系を方針転換して実現
うさぎ
こんにちは。今日は CODH ツール群の暫定ミラーに、Firebase 認証と保存バックエンドを後付けした記録を紹介します。
WhiteCUL
前回の記事では「動かない」と書いていたんですよね?
うさぎ
そうです。前回はログインとキュレーション保存は復旧の対象外として、閲覧専用の暫定ミラーとしていました。
WhiteCUL
方針転換のきっかけは何だったんですか?
うさぎ
JSONkeeper 互換のサーバを 2 系統立てたタイミングで、サーバ側が揃っているのだからミラー本体も認証・保存を有効化してしまおう、という流れになりました。
WhiteCUL
ミラーが完全に動くようになったんですね。

Firebase プロジェクトの差し替え

  • Authorized domains に GitHub Pages ドメインを追加
  • authFirebase.js の firebaseConfig を自前プロジェクトに差し替え
WhiteCUL
Firebase の設定はどう変えたんですか?
うさぎ
オリジナルは codh-81041 プロジェクトを参照していましたが、これは自分たちでは触れないので、既存の個人プロジェクトを当てました。
WhiteCUL
GitHub Pages からログインするために何が必要でしたか?
うさぎ
Firebase Console の Authorized domains に GitHub Pages のドメインを追加することが必須でした。デフォルトでは localhost しか許可されていないので。
WhiteCUL
authFirebase.js の差し替えは全ツールに必要だったんですか?
うさぎ
Viewer、Manager、Editor、Board の 4 ファイルに同じ変更を行いました。Player は保存機能がないので authFirebase.js を持っていません。

signInFlow: popup の落とし穴

  • FirebaseUI 3.x のデフォルトはリダイレクトモード
  • GitHub Pages のサブパス環境では popup を明示指定が必須
WhiteCUL
一番ハマった問題は何でしたか?
うさぎ
Viewer は動くのに Manager や Editor のログインが完了しない、という問題でした。OAuth 同意画面を経て戻ってきても、認証状態が変わらなかったんです。
WhiteCUL
原因は何だったんですか?
うさぎ
Viewer だけ signInFlow: 'popup' が明示されていて、他のツールにはなかったんです。FirebaseUI 3.x のデフォルトはリダイレクトモードで、GitHub Pages のサブパスではうまく動きません。
WhiteCUL
どう直したんですか?
うさぎ
Manager、Editor、Board の authFirebase.js に signInFlow: 'popup' の 1 行を追加するだけで直りました。

JSONkeeper エンドポイントの差し替え

  • 5 ツール計 9 箇所の curationJsonExportUrl を Cloudflare Workers 版に書き換え
  • sed コマンド 1 発で差し替え・巻き戻し可能
WhiteCUL
保存先のエンドポイント変更はどうやったんですか?
うさぎ
Viewer、Manager、Editor、Player、Board の 5 ツールにある curationJsonExportUrl という URL 計 9 箇所を書き換えました。
WhiteCUL
sed コマンドで一括変換できるんですね。
うさぎ
そうです。find で該当ファイルを探して sed で一発置換できます。撤収時もこの逆方向に 1 発で戻せます。
WhiteCUL
バックエンドは 2 系統あるんですか?
うさぎ
Cloudflare Workers と D1 で実装したものを本流、PythonAnywhere の Flask 版を塩漬けの参照実装として並走させています。切り替えは URL を変えるだけです。

Manager のリンク相対化

  • サブツールリンクを絶対 URL から相対パス ../iiif-curation-viewer/ に変更
  • GitHub Pages の兄弟ディレクトリ構成に対応
WhiteCUL
Manager のサブツールリンクも変更したんですか?
うさぎ
Manager には Viewer や Editor で開くリンクがあるんですが、元は codh.rois.ac.jp への絶対 URL でした。今は応答しないので 404 になっていました。
WhiteCUL
どう変えたんですか?
うさぎ
GitHub Pages では各ツールが兄弟ディレクトリに並んでいるので、../iiif-curation-viewer/ のような相対 URL に書き換えました。
WhiteCUL
撤収時の対応も考えてあるんですね。
うさぎ
オリジナルが復旧したら sed で元の絶対 URL に戻せます。クライアント側の差し替えは URL だけなので、ロールバックが容易な設計にしています。

トラブルシューティングとまとめ

  • Authorized domains 未設定 / signInFlow 未指定 / URL 書き換え漏れが主な落とし穴
  • 撤収は 3 ステップで完了できる
WhiteCUL
詰まりやすいポイントをまとめてもらえますか?
うさぎ
auth/unauthorized-domain エラーは Authorized domains 未追加、別タブが閉じるのに状態が変わらないのは signInFlow 未指定、404 エラーは URL 書き換え漏れです。
WhiteCUL
振り返ってどんな気づきがありましたか?
うさぎ
暫定ミラーの「どこまでやるか」は復旧見込みと運用負荷のバランスで変わります。上流の再開が見えないと、結局サーバ側まで自前で持つほうが現実的になりました。
WhiteCUL
クライアント側の変更はシンプルにまとまったんですね。
うさぎ
そうです。差し替え点は Firebase Web config と curationJsonExportUrl の URL だけです。サーバ側をどう実装するかが大半の作業でした。