Firebase

Swift × Firebase で電話番号ログインを実装

こんにちは、株式会社PlaygroundのiOSエンジニア伊原です!

FirebaseのAuthenticationを利用した電話番号認証を実装していきます。

Firebaseで電話番号ログインの設定をする

  1. 電話番号認証をONにする
  2. APNs認証キーの登録
  3. reCAPTCHA検証の設定

1. Firebaseコンソールから電話番号ログインをONにする

Firebase コンソール を開き、

Authentication > ログイン方法 から電話番号認証を有効にします。

2. APNs認証キーの登録

こちらは iOSアプリでPush通知を受信する方法 の最初で詳しく説明しているのでご参考ください。

3. 電話番号ログインのためにreCAPTCHA検証を設定

ユーザーがアプリのバックグラウンド更新を無効にしている場合に備えて、

Firebase SDKでreCAPTHA検証を行えるようにしておきます。

GoogleService-Info.plistファイルにあるREVERSED_CLIENT_IDキーをコピーし、

プロジェクト> TARGETS > info > URL Types

を開きます。

URLSchemes にペーストします。

それ以外は空欄で構いません。

以上でFirebaseの設定は完了です!

Firebaseで電話番号ログインするためのSwiftソースコード

  1. SDKのインストール
  2. SMSに確認コードを送信
  3. ログイン

Firebase Auth SDKのインストール

電話番号認証にアクセスするためにFirebase Auth SDKを導入します。

podfile

pod 'Firebase/Auth'

 

上記をpodfileに記入してpod installを実行します。

入力した電話番号のSMSに確認コードを送信

任意のタイミングで以下の関数を呼ぶとSMSに確認コードが送信されます。


func signUp(phoneNumber: String, failure:@escaping (String) -> Void, success:@escaping () -> Void){
        PhoneAuthProvider.provider().verifyPhoneNumber(phoneNumber, uiDelegate: nil) { (verificationID, error) in
        if let error = error {
                guard let errCode = AuthErrorCode(rawValue: (error._code)) else {return}
                switch errCode {
                case .invalidPhoneNumber:
                    failure("電話番号の形式が違います。")
                default:
                    failure("エラーが起きました。\nしばらくしてから再度お試しください。")
                }
            }
        if let _verificationID = verificationID {
            UserDefaults.standard.set(_verificationID, forKey: "verificationID")
            success()
        }
    }
}
ポイント
  1. [2行目]入力された電話番号を”phoneNumber”引数に持たせます。
  2. [8行目]ログインにはSMSに送信される認証コードと、補完関数に渡される確認IDが必要です。確認ID(verificationID)はローカルで保持しておく必要があるので、UserDefaultsに持たせおきます。

SMSコードを使ってログイン

ログインボタンが押されたタイミングで以下の関数を呼びます。


func signIn(verificationCode: String, failure:@escaping (String) -> Void, success:@escaping () -> Void){
    let verificationID = UserDefaults.standard.object(forKey: "verificationID") as? String
    let credential = PhoneAuthProvider.provider().credential(withVerificationID: verificationID ?? "", verificationCode: verificationCode)
    Auth.auth().signIn(with: credential) { (authResult, error) in
        if let error = error {
                guard let errCode = AuthErrorCode(rawValue: (error._code)) else {return}
                switch errCode {
                case .invalidVerificationCode:
                    failure("認証コードが違います。")
                default:
                    failure("エラーが起きました。\nしばらくしてから再度お試しください。")
                }
            }
        if let _ = authResult {
            success()
        }
    }
}
ポイント
  1. [2行目]入力された確認コードを”verificationCode”引数に持たせています。
  2. [3行目]確認コードと確認IDから、FIRPhoneAuthCredentialオブジェクトを作成します
  3. [4行目]作成したFIRPhoneAuthCredentialオブジェクトを使用して、ユーザーをログインさせます。

以上で完了です!お疲れ様でした。

ABOUT ME
伊原 萌夏
スクール担当 兼 iOS(時々Web)エンジニア。 2019年7月に大学を一年半で辞め、大学とは別で勉強していたプログラムの世界で生きていくことを決意。翌月8月に入社。 主にSwiftのスクールを担当。

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA