teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

出典の追加

2021/06/23 08:59

投稿

takenm
takenm

スコア55

answer CHANGED
@@ -32,4 +32,9 @@
32
32
 
33
33
  以上の実装を行ってあげないといけません。なので、ユーザーにとっては初回にちょっとあるだけのアカウント登録に対して、ここまでやる必要があるかどうかを見極めなければなりません。もちろん、勉強のためなどであれば実装する理由としては十分だと私は思うので、「そんな面倒なことやるな」という意味でもありません。
34
34
 
35
- なので、「実際アカウントを作ってみて、帰ってきたエラーを画面に表示する」という今のやり方と、「自前でバリデーションする」やり方、どちらがが良いかを考えてみることをオススメします。
35
+ なので、「実際アカウントを作ってみて、帰ってきたエラーを画面に表示する」という今のやり方と、「自前でバリデーションする」やり方、どちらがが良いかを考えてみることをオススメします。
36
+
37
+ 出典
38
+ [Firebase Authentication#Authのリファレンス](https://firebase.google.com/docs/reference/swift/firebaseauth/api/reference/Classes/Auth?hl=ja)
39
+ [Firebase Authentication#Constantsのリファレンス](https://firebase.google.com/docs/reference/swift/firebaseauth/api/reference/Constants?hl=ja)
40
+ [Firebase Authentication のパスワードの仕様](https://stackoverflow.com/questions/38064248/firebase-password-validation-allowed-regex/38082508)

1

回答内容を追加

2021/06/23 08:59

投稿

takenm
takenm

スコア55

answer CHANGED
@@ -1,1 +1,35 @@
1
- このケースで複数のバリデーションエラーを表示したいときは自前でバリデーションを実装しなければ実現できないと思います。
1
+ このケースで複数のバリデーションエラーを表示したいときは自前でバリデーションを実装しなければ実現できないと思います。
2
+
3
+ 【追記】
4
+
5
+ すみません。言葉足らずだったので追記しておきます。
6
+ どういうことかというと、SDKに事前にバリデーションするメソッドがない以上、「すべてのエラーが出る」という機能を満たすためには、Firebase側の、Emailでのユーザー作成に関する要件をすべて理解、実装していなければ実現できません。そこまでするほどの機能の重要性なのか、ということです。
7
+ [`createUser(withEmail:password:completion:)`](https://firebase.google.com/docs/reference/swift/firebaseauth/api/reference/Classes/Auth?hl=ja#createuserwithemail:password:completion:)
8
+ こちらのメソッドではコールバックの引数としてエラーが起きた場合は`Optional`の`Error`型一つを返すだけなので、複数のエラーを扱うことはできません。
9
+
10
+ そしてアカウントを作れない場合は以下のとおりです。
11
+ > + `FIRAuthErrorCodeInvalidEmail` - Indicates the email address is malformed.
12
+ + `FIRAuthErrorCodeEmailAlreadyInUse` - Indicates the email used to attempt sign up
13
+ already exists. Call fetchProvidersForEmail to check which sign-in mechanisms the user
14
+ used, and prompt the user to sign in with one of those.
15
+ + `FIRAuthErrorCodeOperationNotAllowed` - Indicates that email and password accounts
16
+ are not enabled. Enable them in the Auth section of the Firebase console.
17
+ + `FIRAuthErrorCodeWeakPassword` - Indicates an attempt to set a password that is
18
+ considered too weak. The NSLocalizedFailureReasonErrorKey field in the NSError.userInfo
19
+ dictionary object will contain more detailed explanation that can be shown to the user.
20
+
21
+ 上から順に
22
+ - 不正なアドレス形式
23
+ - すでにそのアドレスのユーザーが居る
24
+ - Emailでのユーザー作成がFirebase側で有効になっていない
25
+ - パスワードが弱い
26
+
27
+ です。これらすべてに対してエラーを出したい場合、自前ですべてバリデーションする実装が必要になります。
28
+ - 不正なアドレス形式 -> 正規表現で対応可能
29
+ - パスワードが弱い -> 複雑ながらも対応可能。パスワードの仕様は長さ、使用できる文字の種類が限られている(かななどは不可)の2つがある。この2項目をそれぞれバリデーションする必要がある。[参考](https://stackoverflow.com/questions/38064248/firebase-password-validation-allowed-regex/38082508)
30
+ - すでにそのアドレスのユーザーが居る -> [このメソッド](https://firebase.google.com/docs/reference/swift/firebaseauth/api/reference/Classes/Auth.html?hl=ja#fetchsigninmethodsforemail:completion:)で、[この定数文字列](https://firebase.google.com/docs/reference/swift/firebaseauth/api/reference/Constants?hl=ja#emailpasswordauthsigninmethod)がコールバックの引数に入ってないか調べる
31
+ - Emailでのユーザー作成がFirebase側で有効になっていない -> 設定するばいいので起こり得ない
32
+
33
+ 以上の実装を行ってあげないといけません。なので、ユーザーにとっては初回にちょっとあるだけのアカウント登録に対して、ここまでやる必要があるかどうかを見極めなければなりません。もちろん、勉強のためなどであれば実装する理由としては十分だと私は思うので、「そんな面倒なことやるな」という意味でもありません。
34
+
35
+ なので、「実際アカウントを作ってみて、帰ってきたエラーを画面に表示する」という今のやり方と、「自前でバリデーションする」やり方、どちらがが良いかを考えてみることをオススメします。