5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Firebaseでやたらと再認証が要求される件

Posted at

Qitta初投稿になります。モバイルエンジニアのEtsuwoです。

Firebase便利ですよね。
特にログイン周りを一挙に任せられる点がとても優秀だなーと感じています。
しかし、もうちょっと融通効かないかなーとか思ってしまう点もあります。
その代表が「再認証」がやたらと要求される点だと思っています。
セキュリティ的に仕方ないのかもしれませんが、しっかり考慮しないと普通に欠陥サービスになってしまうと間違いなしだと思うので記事にします。

再認証とは

Firebaseではセキュリティ的に重要な操作を行う際、最後の認証から一定時間以上経過していると「再認証」が求められます。
「本当にこの操作行って良いのか」or「本当に本人なのか」確認するためにもう一回ログインしろよってことですね。
再認証は最後の認証から5分以上経過している場合に、以下の処理を行う時に必要になります。

  • メールアドレスの変更
  • メールを使用しないパスワードの変更
  • ユーザアカウントの削除

最後の認証から5分以上経過して以上の処理を行うと、FIRAuthErrorCodeRequiresRecentLoginのエラーが返ってきます。

どうすれば良いのか

方針は二つあると考えています。

  1. 再認証を求められる可能性がある処理を行う前に前もってユーザに再認証させる
  2. FIRAuthErrorCodeRequiresRecentLoginが返ってくるたびに再認証させる

僕としては圧倒的に1がオススメかなと考えています。
なぜなら5分という時間がかなーり短く、場合によってはほぼ確定で再認証することになるからです。
例えば、ユーザ削除の処理を行う際に2の方針をとった場合、
ユーザ削除の処理を行う→再認証を求められて再認証処理→もう一回ユーザ削除処理
と3ステップ必要ですが、1の場合は、
再認証処理→ユーザ削除処理
と2ステップで済むので処理的にもユーザ体験的にも楽です。

なおユーザの再認証にはreauthenticate(with:)メソッドを使用します。
以下はiOSでの使用例です。

reauthenticate.swift
let user = Auth.auth().currentUser
var credential: AuthCredential // 何らかのプロバイダで認証

user?.reauthenticate(with: credential) { error in
  if let error = error {
    // エラー処理
  } else {
    // 成功時の処理
  }
}

最後に

再認証を考慮し忘れるとかなりクリティカルな気がします。
実装によってはひどいことになるので気をつけましょう。

参考文献

Firebaseでユーザ管理:iOS

5
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?