質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.59%

Firebase Authenticationで電話認証させて既にユーザー登録してるか否かで分岐させる実装

解決済

回答 2

投稿

  • 評価
  • クリップ 2
  • VIEW 1,625

score 15

Firebase Authenticationで電話認証させて認証番号を入力させる。

次に電話番号が登録されてるか否かで分岐させる。

登録されてたらホーム画面へ、未登録であれば登録画面へ遷移させる。

Firebase Authentication周りのドキュメント見てるのですが分かりません。

signInAndRetrieveDataWithCredential:(FIRAuthCredential *)credential
                                 completion:(nullable FIRAuthDataResultCallback)completion;
signInWithCredential:(FIRAuthCredential *)credential
                  completion:(nullable FIRAuthResultCallback)completion DEPRECATED_MSG_ATTRIBUTE(
                                      "Please use signInAndRetrieveDataWithCredential:completion:"
                                      " for Objective-C or signInAndRetrieveData(with:completion:)"
                                      " for Swift instead.");

ここら辺のメソッドをいじって条件分岐させるのかなと考えてます。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

これでどうでしょう??? Swift // currentUserがnilならログインしていない if FIRAuth.auth()?.currentUser == nil { // ログインしていない時の処理 } else { // ログインしている時 }

/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

Firebase Authentication で 携帯番号認証 を 実装して試してみました。

すると、hirukoさん、の言っているような挙動は認められませんでした。

まず、1度電話番号でユーザー登録すると
電話番号ごとに「ユーザーUID」というものが作られることをFirebaseのconsoleで確認できるでしょうか?
なので、このユーザーUIDを用いることで、同じ本人(固有文字列を知っている人)かどうかを照合できます。
しかし、このUIDを他のデータベース等と照合するのはgoogleでは非推奨とされています。(どこかに書いてありました)
コードは多少はしょりますが、

Auth.auth().signInAndRetrieveData(with: credential) { (success, error) in
    if error != nil {
        print("error:", error)
    } else {
        print("success:", success)
        print(success?.user.uid) // <-この文字列が携帯番号ごとに一意となります。
    }
}

で、本題はここからですが、想定している2通りの場面を考えると

①既にユーザー登録した人が他の端末でアプリを使用する時 
これは、携帯電話番号が変わらず本人のものかどうかが大事になります。
もし、本人のものである場合は、その携帯に送られてくるワンタイムパスワード番号を入力してもらえれば、
本人の情報を取得でき、本人としてログインできます。
ex) 携帯を手元に持ってて、たまたまパソコンからサービスにログイン、
送られてくるワンタイムパスワードをその場で見て入力するパターン

一方、もし携帯電番号がすでに本人のものでなくなった場合ですが、
この場合はワンタイムパスワードをもらえないので、他のログイン方法を確保しておく必要があります。
それを利用して携帯電話番号を修正できるようにしておかなければなりません。

②ユーザー登録済みの人が一旦アプリを削除して、再インストールした時
自分の環境で行ってみましたが、同じ番号を用いている限り、
登録画面(絵を実際に選ぶ作業???)に飛ばされることはなかったです。
本当に番号を初めて入力する初回のみ、Robotじゃない確認で絵を選ばされましたが、
それ以外はRobotじゃない確認をしています。って表示されるだけで、
勝手に自動認証してくれて、ワンタイムパスワードが送られてきましたよ。
それはアプリを一度削除し、インストールし直したとしてもです。

仕様上、botじゃないという検証の自動認証ページに関しては、
飛ばすことはできないと思います。

これで答えになるでしょうか???

もう一度、質問を読んでみましたが、
もしかして、自分でログイン画面と登録画面を実装し、場合分けし、
表示を変えたい・アプリ特有のユーザーの設定情報を保存したいということですか?

その場合は、Firebaseにログイン回数や最終ログイン日
場合によってはアプリの設定情報なども
ユーザー情報として保存した方がいいのではないでしょうか?

FirebaseのAuthenticationの仕様上、
番号を入力ワンタイムパスワードを要求し、ログインした時点で、
これまで登録がなくても、携帯番号は登録されますし、
uidも作成されてしまうので、その後でそれらを取得しても、
区別はできないと思われます。

上記コードの「success?.user.」と打ち込んでメソッドをみてみると、 userdefaults.standardのように fs_setBoolVariable("", forKey: ""), fs_setIntegerVariable("", forKey: ""), fs_setVariable("", forKey: ""), fs_setFloatVariable("", forKey: "") などがあるので、これらを利用して、

上記を試してみましたが、うまく利用できませんでした。
やはり、firebaseのrealtime databaseかfirestoreに自分でデータ登録するか、

もしくはfirebaseで与えられてるユーザーのemail, displayname, photoURL などの
要素の初期値を変更したかどうかで条件分岐するのがいいのではないでしょうか?

これで解決できるのではないでしょうか???

ちなみに、調べた限り、firebaseのAuthenticationの
consoleに表示されている作成日とログイン日は
Administer権限がないと取得できないみたいなので、
実際にアプリのコード内で利用することはできないと思います。
[参考URL] https://firebase.google.com/docs/auth/admin/manage-users?hl=ja

長くなってしまいました。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/07 20:29

    Firebase Authenticationの電話番号認証の実装やったことありますか?

    キャンセル

  • 2019/01/07 20:32

    Emailを行ったことはありますが、電話番号も同様の機構と思っておりました。
    全く別の機序でしたでょうか?だとしたら、およびじゃなかったですね。
    失礼しました。

    キャンセル

  • 2019/01/07 20:44

    ・既にユーザー登録した人が他の端末でアプリを使用する時
    ・ユーザー登録済みの人が一旦アプリを削除して、再インストールした時
    現状だと上記の場合も登録画面に飛ばされてしまうので分岐させる必要があります。

    Firestoreの電話番号を検索して登録されてるか否か試してみようと思います。

    キャンセル

0

返り値のFIRAuthDataResultCallbackの中にuserプロパティがあるっぽい

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る