Slide 1

Slide 1 text

Undocumented!? Firebase Jumpei Takiyasu @juntaki M3, Inc.

Slide 2

Slide 2 text

name <- "Jumpei Takiyasu" company <- "M3, Inc." web <- "https://juntaki.com" Me

Slide 3

Slide 3 text

Firebaseははまりどころ多め あんまりドキュメントや情報が無い

Slide 4

Slide 4 text

今回やりたかったこと エムスリー:ファイルをアップロード&サイトURLお知らせ クライアント: URLアクセス→アカウント作成→ファイルダウンロード 関係ない人:アカウント作成するも、ログイン画面から進めない ファイル送信時点ではアカウントがないので、次のようにした ● メールアドレスにファイルを紐付ける ● ファイルを送られてない人はそもそも入ることすらできない

Slide 5

Slide 5 text

Hostingでアクセス制限したい IPアドレス制限(QA環境) Auth通った人だけ →できない

Slide 6

Slide 6 text

AppEngine + Admin SDKで静的ファイル配信 IPアドレス制限 →ファイヤウォールルールで設定 Auth通った人だけ →CookieでTokenIDを渡して、Admin SDKで検証 オーバースペック感はある ※ここはGoで書きました

Slide 7

Slide 7 text

FirestoreのクエリがPermission denied 一覧は全件取得しておけば、権限があるやつだけくるだろ〜 →できない

Slide 8

Slide 8 text

セキュリティルールはフィルタではない 権限があるものだけヒットするようにクエリを出さないといけない

Slide 9

Slide 9 text

メール確認したのに、emailVerified == false ● セキュリティルールでファイルのemailとアカウントの一致をチェック ● emailVerified == trueも条件にせざるを得ない メール確認のURLを踏んでも、Permission denied しかも、しばらくするとアクセスが通るという謎の現象

Slide 10

Slide 10 text

Firebaseにクエリを投げる前にGetIdToken(true)しましょう(強制再取得) Token取得時にどうだったのかが大事 GetIdToken() emailVerified ==false (2hours) メール確認 emailVerified ==false Firebase側の状態 フロントエンドの状態 emailVerified ==true Firestoreクエリ Token側がfalseだ から権限はない 時間 時間

Slide 11

Slide 11 text

Storageにアップロードしたファイルが壊れる アップロードは成功するし、サイズもあるのに、ファイルが壊れる

Slide 12

Slide 12 text

カスタムメタデータ名に”@”はダメ どこにも書いてない!(メールアドレスをキーにしたかった) →ハッシュ値にすることで回避

Slide 13

Slide 13 text

Storageのダウンロードログ残したい →できない Cloud functionsでもトリガは4つだけ、Cloud Audit Loggingも対象外 ● アーカイブ ● 削除 ● 作成 ● メタデータ変更

Slide 14

Slide 14 text

解決策:操作ログをDBに書く じゃあ、”log”ってCollection作って、JavaScrpitから書くようにして・・ →できない

Slide 15

Slide 15 text

“log”というコレクションは作れるが使えない 解決策:なんかそれ以外の名前にしましょう

Slide 16

Slide 16 text

まとめ いろいろハマったが、結果的に2日もかからずに新しいサービスができた (QA・デザイン込でも5人日程度) Firebaseは便利

Slide 17

Slide 17 text

Thank you! Jumpei Takiyasu @juntaki M3, Inc. https://juntaki.com