Qitta初投稿になります。モバイルエンジニアのEtsuwoです。
Firebase便利ですよね。
特にログイン周りを一挙に任せられる点がとても優秀だなーと感じています。
しかし、もうちょっと融通効かないかなーとか思ってしまう点もあります。
その代表が「再認証」がやたらと要求される点だと思っています。
セキュリティ的に仕方ないのかもしれませんが、しっかり考慮しないと普通に欠陥サービスになってしまうと間違いなしだと思うので記事にします。
再認証とは
Firebaseではセキュリティ的に重要な操作を行う際、最後の認証から一定時間以上経過していると「再認証」が求められます。
「本当にこの操作行って良いのか」or「本当に本人なのか」確認するためにもう一回ログインしろよってことですね。
再認証は最後の認証から5分以上経過している場合に、以下の処理を行う時に必要になります。
- メールアドレスの変更
- メールを使用しないパスワードの変更
- ユーザアカウントの削除
最後の認証から5分以上経過して以上の処理を行うと、FIRAuthErrorCodeRequiresRecentLogin
のエラーが返ってきます。
どうすれば良いのか
方針は二つあると考えています。
- 再認証を求められる可能性がある処理を行う前に前もってユーザに再認証させる
-
FIRAuthErrorCodeRequiresRecentLogin
が返ってくるたびに再認証させる
僕としては圧倒的に1がオススメかなと考えています。
なぜなら5分という時間がかなーり短く、場合によってはほぼ確定で再認証することになるからです。
例えば、ユーザ削除の処理を行う際に2の方針をとった場合、
ユーザ削除の処理を行う→再認証を求められて再認証処理→もう一回ユーザ削除処理
と3ステップ必要ですが、1の場合は、
再認証処理→ユーザ削除処理
と2ステップで済むので処理的にもユーザ体験的にも楽です。
なおユーザの再認証にはreauthenticate(with:)
メソッドを使用します。
以下はiOSでの使用例です。
let user = Auth.auth().currentUser
var credential: AuthCredential // 何らかのプロバイダで認証
user?.reauthenticate(with: credential) { error in
if let error = error {
// エラー処理
} else {
// 成功時の処理
}
}
最後に
再認証を考慮し忘れるとかなりクリティカルな気がします。
実装によってはひどいことになるので気をつけましょう。