2017-09-14 7 views
0

ここで初心者です。私がやろうとしているのは、ユーザーが自分の電話番号で登録することができるようにすることです。電話番号が管理者によって先に追加された場合に限ります。どんなヘルプやリソースへのリンクも非常に役に立ちます。ありがとう!Firebase:管理者によって追加された電話番号に基づいてユーザを登録する

+0

ユーザがFirebase認証で自分自身を認証するのを防ぐ方法はありません。しかし、他のリソースを使用できないようにすることができます。 Firebaseデータベースでそれを行う方法の詳細については、https://firebase.google.com/docs/database/security/user-security –

+0

を参照してください。あなたとアレックスの答えから、私は思っていなかったと思います。手を差し伸べる前に携帯電話番号を確認しておくと、問題が発生してしまいます。おそらく私は管理者が携帯電話番号を入力し、そのコード/パスワードを使用してログインして後でパスワードを変更するようユーザーに尋ねるとすぐに、(おそらく第三者経由で)SMSの確認を送信するだけです。 [編集:可読性] – user165242

答えて

1

基本的にあなたの管理者アカウントを使って、ノード内に「良い」番号を追加して、「white_list」とその参照whiteListRefを追加する必要があります。

その後、あなたは彼の電話番号を介してユーザを登録するには2つの本質的なFirebase方法が必要になり、最初のものは次のとおりです。

PhoneAuthProvider.provider().verifyPhoneNumber(phone_number) { } 

これは、ユーザーに確認コードを送信します。

その後、あなたは、このメソッドを追加する必要があります。

Auth.auth().signIn(with: credential) { } 

資格は、あなたが最初の方法から得たverificationID、そして彼の番号が正しかった場合、ユーザーが自分の電話番号に受け取った確認コードを使用して作成されます。あなたのケースでは

let credential = PhoneAuthProvider.provider().credential(
     withVerificationID: verificationID, 
     verificationCode: verificationCode) 

、あなたはあなたのユーザーがで入力した電話番号は(あなたの管理者がwhite_listノードに追加した)ホワイトリストの中にあることを確認する必要があります。データベースの構造によっては、たとえば、あなたがこのような方法で使用できます。

func registerPhoneNumber(_ phoneNumber: String, completion: @escaping() -> Void) { 

     PhoneAuthProvider.provider().verifyPhoneNumber(phoneNumber) { [weak self] (verificationID, error) in 

      guard error == nil else { 
       return 
      } 

     self?.checkNumberEligibility(phoneNumber) { (isNumberOkay) in 

      guard isNumberOkay else { 
       return 
      } 

      UserDefaults.standard.set(verificationID, forKey: "authVerificationID") 

     } 

     } 

    } 


    func verifyCode(_ verificationCode: String, completion: @escaping() -> Void) { 

     guard let verificationID = UserDefaults.standard.string(forKey: "authVerificationID") else { 
      return 
     } 

     let credential = PhoneAuthProvider.provider().credential(
      withVerificationID: verificationID, 
      verificationCode: verificationCode) 

     Auth.auth().signIn(with: credential, completion: { (user, error) in 

      guard error == nil else { 
       return 
      } 

      completion() 

     }) 

    } 

これは働くだろう、しかし、へ:最後に

func checkNumberEligibility(_ phoneNumber: String, completion: @escaping(Bool) -> Void) { 

     whiteListRef.observeSingleEvent(of: .value, with: { (snapshot) in 

     guard let numberEligibility = snapshot.childSnapshot(forPath: "eligibility").value as? String else { return } 

     if numberEligibility == "good" { 
      completion(true) 
     } else { 
      completion(false) 
     } 

    }) 

を、あなたはこのような何かを持っているでしょうこのようにすると、セキュリティ問題にさらされる可能性のある人物(つまり、あなたのアプリの非ユーザであっても)をホワイトリストノードにアクセスさせる必要があることを意味します。したがって、このシステムを実装する前にそれを検討してください。

質問がありましたらお知らせください。

+0

あなたは正しいです。私はセキュリティの問題を考えなかった。携帯電話番号は公開される。答えをありがとう。私はそれから学んだ。 – user165242

+0

問題はない、私は助けることができてうれしい – Alex

関連する問題