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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

3328閲覧

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

vasucodagama

総合スコア19

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

2クリップ

投稿2019/01/07 10:43

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

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

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

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

Swift

1signInAndRetrieveDataWithCredential:(FIRAuthCredential *)credential 2 completion:(nullable FIRAuthDataResultCallback)completion;

Swift

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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

/////////////////////////

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

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

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

Swift

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

で、本題はここからですが、想定している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 11:16

編集2019/01/07 16:35
hameji001

総合スコア639

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

vasucodagama

2019/01/07 11:19

ユーザーがログインしてるか否かではなく、ユーザーが登録してるか否かでの分岐の話をしております。
hameji001

2019/01/07 11:26 編集

すみませんでした。勘違いしておりました。 セキュリティーの問題が、、、はっきりわかりませんが、 番号のみ別にデータベースを作成し、保存し、そこを検索する方法はダメでしょうか? 番号のみの保存なら、セキュリティー的にどことも紐付けできないなら、 問題とならない気がしちゃいます。 というか、ユーザーなら自分の番号を検索する必要はなく、他人の番号ってことですよね? もし自分の番号なら、ログイン前ならいざ知らず、 ログインできる=番号があるで、結局はログインしているが条件になるのでは。。。
vasucodagama

2019/01/07 11:29

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

2019/01/07 11:32

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

2019/01/07 11:44

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

0

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

投稿2019/01/07 11:30

vasucodagama

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問