Firebaseの認証について色々調べる機会があったので、メモ書きですが残したいと思います。
トークンは2種類
- FirebaseIDトークン(jwt)
- 認証に使われる
- 有効期限は1時間
- 更新トークン(refreshToken)
- 新しいFirebaseIDトークンを発行するのに必要
- 有効期限は無い
ユーザーを無効化や削除した時は更新トークンが無効になる。FirebaseIDトークンを即時無効にすることはできない。
FirebaseIDトークンの有効期限を待てない場合は、無効化したuidのブラックリストを作りセキュリティルールで弾く等の工夫が必要。
フロントで検知する方法
onAuthStateChanged
を使うとログイン、ログアウト、トークン更新時に処理を加えることができる
firebase.auth().onAuthStateChanged((user) => {
if (user) {
// ログイン中
} else {
// 未ログイン
// ex) ログインページに飛ばす
}
});
似た関数でonIdTokenChanged
があるが、4.0.0以前ならonAuthStateChanged
と同じ動作になり、4.0.0からはログイン、ログアウト時のみ動作するので注意。
firebase-functionsでの認証
onCall
を使うとトークンの検証をやってくれる。onRequest
はやってくれないので、自前でトークン検証を実装する必要あり。
onCallの検証について
パターン | 結果 |
---|---|
トークン無し | OK |
有効なトークン | OK |
無効なトークン(適当な文字列) | NG |
期限切れトークン | NG |
NGの場合はunauthenticatedを返して終了する。
トークン無しの時OKになることに注意。誰でもアクセスされると困る場合はonCallの第二引数のcontextのauthがundefinedなので、undefinedならunauthenticatedを返して終了するようにすればOK。
また、Firebaseエミュレータを使っている場合はトークンの検証はせず常にOKになるので注意。
該当するユーザーがいない場合、context.authは下記が返ってくる。
{ uid: undefined, token: { uid: undefined } }
参考
https://firebase.google.com/docs/auth/admin/manage-sessions?hl=ja
https://firebase.google.com/docs/auth/admin/verify-id-tokens?hl=ja
https://firebase.google.com/docs/reference/js/v8/firebase.auth.Auth#onauthstatechanged