LoginSignup
24
18

More than 1 year has passed since last update.

[SwiftUI]Firebase Authenticationで認証機能を実装する方法[SPM]

Last updated at Posted at 2022-01-09

※最新の記事は社用のテックブログに記載しましたので最新の情報は以下を参考にしていただければと思います。
https://tech.nri-net.com/entry/firebase_swift_async_await

実装する機能

今回はFirebaseを使用して認証機能を実装していく方法をご紹介します。
FirebaseはGoogleが提供するmobile Backend as a ServiceでmBaaS(エムバース)と呼ばれており、データの管理や認証周りを簡単に実装する事ができます。
今回はFirebaseを利用して、アプリへの認証記録やアカウント管理を端末側では行わず、Firebase側に任せた実装を行なっていきます。

環境

・ macOS: Monterey
・ Xcode: 13.1
・ SDK Version: iOS 8.10.0

内容

・Firebaseへの登録
・FirebaseをSwift Package Managerでインストール方法
・Firebase Authenticationで認証機能を設定
・メールアドレスとパスワードによる実装
 ・Sign Inの実装
 ・Sign Upの実装
 ・Sign Outの実装
 ・パスワードのリセット(変更方法)
以上です。

認証機能の呼び方について

認証機能の呼び方につきましては
[ログイン] - [ログアウト]
[サインイン] - [サインアウト]
という言葉が用いられていますが、どちらも意味に違いはないそうです。今回は昨今の認証機能として"サインイン"を用いるケースが多いようなので[サインイン] - [サインアウト]で統一いたします。
(余談ですがWindowsも7まではログオン、ログオフという記入があったようですが現在(Win10)はサインイン、サインアウトとなっているそうです)
またアカウントを作る作業を[サイン アップ]とさせていただきます。

全体像

下記図のようにメールアドレスとパスワードを入力するとFirebase側に登録されいればサインインを行い、されていなければエラーを返します。
登録されていなければサインアップを行います。サインイン、サインアップのいずれかを行うとサインインの状態になり、サインアウトすることができます。
またパスワードを忘れたり、任意に変更したりすることもできます。これらを以下の図のようなイメージで作っていきたいと思います。(サインアップも同様)

Firebaseへの登録

まずFirebaseを利用する準備を行います。Firebaseへの登録は5分もあればできると思います。
(Googleアカウントは必須になりますので持っていない方は作成してください)
登録はコチラから行えます。

使ってみるを選択

プロジェクトを追加を選択(既にプロジェクトがあるとここに表示される)

プロジェクトの作成途中にアナリティクスの有効の有無を聞いてきますが、無料でかつ強力なアナリティクスを使用できますので有効にする事をおすすめします。

後は手順通りに進めていけば問題ないです。途中GoogleService-Info.plistをダウンロードする画面が出てきますが、後で使用しますので分かる場所に保存しておく事をおすすめします。

FirebaseをSwift Package Managerでインストール方法

projectより追加していきます。

赤枠部分を選択して追加していきます。

All Sourcesより赤枠の部分にgithub.com/firebase/firebase-ios-sdk.gitを入力してライブラリをインストールしていきます。
公式ドキュメントはコチラ

Firebase Authenticationで認証機能を設定

Firebaseで作成したプロジェクトを選択し Authentication→Sign-method→新しいプロバイダを追加→メール/パスワード を選択して追加することで、Firebase側でメールアドレスとパスワードで認証する機能を追加することができます。 下準備はここまでです。 ## メールアドレスとパスワードによる実装 ### AppDelegateの追加 最初にAppDelegateを追加していきます。(Xcode12以降プロジェクト開始時にSwiftUIを選択するとAppDelegateが初期で無いので追加しないといけません。) アプリ名App.swiftファイルにimport FirebaseとAppDelegateクラスを以下のように追加します。
import Firebase

class AppDelegate: NSObject, UIApplicationDelegate {
    func application(_ application: UIApplication, didFinishLaunchingWithOptions
                     launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        FirebaseApp.configure()
        return true
    }
}

続いて同じファイル内にあるstructに@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegateを追加します。

@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }

AppDelegateの追加は以上です。

GoogleService-Info.plistの追加

Firebaseでプロジェクトを作成する際GoogleService-Info.plistのダウンロードをしていると思いますのでファイルにドラッグ&ドロップで追加していきます。
スクリーンショット 2022-01-09 15.49.24.jpg

SignInの実装

 Auth.auth().signIn(withEmail: email, password: password) { user, error in
    if error == nil {
        //サインイン成功
    } else {
        if let errorCode = AuthErrorCode(rawValue: error!._code) {
            switch errorCode {
            case .invalidEmail:
                //メールアドレスの形式によるエラー
            case .weakPassword:
                //パスワードが脆弱(6文字以下)
            case .wrongPassword:
                //パスワードが間違っている
            case .userNotFound:
                //ユーザー情報が見つからない(未登録)
            case .networkError:
                //通信エラー
            default:
                //その他エラー
            }
        }
    }
}

caseの後のエラーは補完でも沢山出てきますが必要なものだけ設定します。

SignUpの実装

Auth.auth().createUser(withEmail: email, password: password) { result, error in
    if error == nil {
        //サインアップ成功
    } else {
        if let errorCode = AuthErrorCode(rawValue: error!._code) {
            switch errorCode {
            case .invalidEmail:
                //メールアドレスの形式によるエラー
            case .weakPassword:
                //パスワードが脆弱(6文字以下)
            case .emailAlreadyInUse:
                //メールアドレスが既に登録されている
            case .networkError:
                //通信エラー
            default:
                //その他エラー
            }
        }
    }
}

こちらもサインイン同様、必要なエラーハンドリングだけ設定します。

※サインインやサインアップのエラー処理については公式に詳細が掲載されていますので(こちら)[https://firebase.google.cn/docs/auth/ios/errors?hl=en&skip_cache=true%22]からどうぞ。

SignOutの実装

サインアウトのメソッドにはthrowsが付いているので(エラーを投げる可能性のあるメソッド)do,try,catchを使用して以下のようにします。
スクリーンショット 2022-01-06 13.06.25.jpg

do {
try Auth.auth().signOut()
    //サインアウトした時の処理
} catch {
    //エラー時の処理
}

パスワードのリセット

以下のメソッドが成功すると入力したメールアドレスにFirebase AuthenticationのTemplates内にあるパスワードの再設定で設定した内容の文章が送られ、本文にあるリンクよりパスワードがリセットできるようになっている。

Auth.auth().sendPasswordReset(withEmail: email) { error in
    if error == nil {
        //成功した時の処理
    } else {
        if let errorCode = AuthErrorCode(rawValue: error!._code) {
            switch errorCode {
            case .userNotFound:
                //ユーザー情報が見つからない(未登録)
            case .invalidEmail:
                //メールアドレスの形式によるエラー
            default:
                //その他エラー
            }
        }
    }
}

最後に

これでFirebase Authenticationを利用して
 ・Sign Inの実装
 ・Sign Upの実装
 ・Sign Outの実装
 ・パスワードのリセット
ができます。誰かの役に立てば幸いです^^

24
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
18