Firebase Authの注意点2つと対策コード (弱いパスワードを正規表現で対策 / 不正ログイン防止)


問題です 🤔

FirebaseAuthは弱いパスワード登録を拒否してauth/weak-passwordというエラーを返す機能があります。
Auth | JavaScript SDK  |  Firebase

では、以下の激弱パスワードは拒否してくれるでしょうか?
password: 1234567890

答えは、「登録できてしまう」です。 (2019/10月時点)
以下に対策コードを紹介しますので、ぜひ活用して下さい。

はじめに

今回はFirebase Authenticationの注意点として、不正ログイン対策等を説明します
以下2点に注意することで、より良いセキュリティ対策を目指しましょう。

注意点1: 弱いパスワードは拒否しよう

この激弱パスワード、Firebase Authは拒否してくれません (2019/10月時点)
password: 1234567890

Firebase Authを使っていても弱いパスワードで登録できてしまうことに注意しましょう。
ただしFirebase Authにはレートリミットが実装されているため深刻な欠点という訳では無いと思います。

とはいえ、何らかの対策をしておくことが望ましいでしょう。
具体的には英数小文字大文字混在でXX文字以上などの制限を設けておくと良いと思います。

上記のレートリミットがあることも考慮して、私は以下のような正規表現で対策しています。

対策コード(正規表現)

regex.js
// 10文字以上であること
// 英数字が混在していること
// 大文字と小文字のアルファベットが含まれること
regex: /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{10,}$/

参考: jquery - javascript regex for password containing at least 8 characters, 1 number, 1 upper and 1 lowercase - Stack Overflow

注意点2: 登録メールアドレスは確認しよう

Firebase Authのメール/パスワード登録には仮登録という段階がありません。
例えば他人のメールアドレス/自由なパスワードで登録できてしまいます。

その場合、メールアドレスを使われた人が自分のアドレスで登録しようとすると
auth/email-already-in-useといったエラーが出て登録できなくなってしまいます。
Auth | JavaScript SDK  |  Firebase

対策としてメールを送り開封確認しましょう。(無料で送信可能)
Firebase のユーザーを管理する  |  Firebase

sample.js
var user = firebase.auth().currentUser;

user.sendEmailVerification().then(function() {
  // Email sent.
}).catch(function(error) {
  // An error happened.
});

上記の sendEmailVerification() で送信されたメール内のリンクをクリックすると
Firebaseが開封を検知して以下のように記録されます。

  • JWT内に記載されているメール確認フラグ emailVerified がtrueになる
  • Firebase Admin SDK で確認できるアカウントのフラグ emailVerified がtrueになる

このフラグを利用して

  • メール未確認のJWTは拒否(POST等に対してエラーを返す)
  • メール未確認のアカウントを定期的に削除

といった対策を行いましょう。
これらを実装することで、よくある「仮登録」の段階を実現できると思います。

以上、拙い記事でしたが何かのご参考になれば幸いです🙇‍♂️