Apple プラットフォームで Firebase Authentication を使ってみる

Firebase Authentication を使用すると、ユーザーがアプリにログインする際に、メールアドレスとパスワードによるログインや、フェデレーション ID プロバイダによるログイン(Google ログインや Facebook ログインなど)などの 1 つ以上の方法を使用できるようになります。このチュートリアルでは、Firebase Authentication を使って、メールアドレスとパスワードのログインをアプリに追加する方法から始めます。

アプリを Firebase に接続する

  1. Firebase SDK をインストールします
  2. Firebase コンソールで、Firebase プロジェクトにアプリを追加します。

Firebase Authentication をアプリに追加します。

Swift Package Manager を使用して Firebase の依存関係のインストールと管理を行います。

  1. Xcode でアプリのプロジェクトを開いたまま、[File] > [Add Packages] の順に移動します。
  2. プロンプトが表示されたら、Firebase Apple プラットフォーム SDK リポジトリを追加します。
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. Firebase Authentication ライブラリを選択します。
  5. ターゲットのビルド設定の [Other Linker Flags] セクションに -ObjC フラグを追加します。
  6. 上記の作業が完了すると、Xcode は依存関係の解決とバックグラウンドでのダウンロードを自動的に開始します。

(省略可)Firebase Local Emulator Suite でプロトタイピングとテストを行う

アプリによるユーザーの認証方法について見ていく前に、Authentication 機能のプロトタイピングとテストに使用できるツールである Firebase Local Emulator Suite について紹介します。認証手法やプロバイダを検討している場合や、AuthenticationFirebase Security Rules を使用して公開および非公開のデータで各種データモデルを試している場合、さらに、ログイン時の UI デザインのプロトタイプを作成している場合などは、ライブサービスをデプロイせずにローカルで作業できると便利です。

Authentication エミュレータは Local Emulator Suite の一部であり、これを使用すると、アプリはエミュレートされたデータベースのコンテンツと構成とやり取りでき、エミュレートされたプロジェクト リソース(関数、他のデータベース、セキュリティ ルール)ともオプションでやり取りできるようになります。

いくつかの手順を実施するだけで、Authentication エミュレータを使用できます。

  1. アプリのテスト構成にコード行を追加して、エミュレータに接続します。
  2. ローカル プロジェクトのディレクトリのルートから、firebase emulators:start を実行します。
  3. 対話型のプロトタイピングには Local Emulator Suite UI を使用し、非対話型のテストには Authentication エミュレータ REST API を使用します。

詳細な手順については、アプリを Authentication エミュレータに接続するをご覧ください。詳細については、Local Emulator Suite の概要をご覧ください。

次に、ユーザーの認証方法を見てみましょう。

Firebase SDK を初期化する

アプリのデリゲートで、まず Firebase SDK をインポートします。

SwiftObjective-C
import FirebaseCore
@import FirebaseCore;

次に、application:didFinishLaunchingWithOptions: メソッドで、FirebaseApp オブジェクトを初期化します。

SwiftObjective-C
// Use Firebase library to configure APIs
FirebaseApp.configure()
// Use Firebase library to configure APIs
[FIRApp configure];

認証状態をリッスンする

ログイン中のユーザーの情報を必要とするアプリの各ビューに対して、FIRAuth オブジェクトにリスナーをアタッチします。このリスナーは、ユーザーのログイン状態が変わるたびに呼び出されます。

ビュー コントローラの viewWillAppear メソッドでリスナーをアタッチします。

SwiftObjective-C
handle = Auth.auth().addStateDidChangeListener { auth, user in
  // ...
}
self.handle = [[FIRAuth auth]
    addAuthStateDidChangeListener:^(FIRAuth *_Nonnull auth, FIRUser *_Nullable user) {
      // ...
    }];

ビュー コントローラの viewWillDisappear メソッドでリスナーをデタッチします。

SwiftObjective-C
Auth.auth().removeStateDidChangeListener(handle!)
[[FIRAuth auth] removeAuthStateDidChangeListener:_handle];

新しいユーザーを登録する

新規ユーザーがメールアドレスとパスワードを使用してアプリに登録できるフォームを作成します。ユーザーがフォームに入力したら、ユーザーから提供されたメールアドレスとパスワードを検証し、それらを createUser メソッドに渡します。

SwiftObjective-C
Auth.auth().createUser(withEmail: email, password: password) { authResult, error in
  // ...
}
[[FIRAuth auth] createUserWithEmail:email
                           password:password
                         completion:^(FIRAuthDataResult * _Nullable authResult,
                                      NSError * _Nullable error) {
  // ...
}];

既存のユーザーをログインさせる

既存のユーザーがメールアドレスとパスワードを使用してログインできるフォームを作成します。ユーザーがフォームに入力したら、signIn メソッドを呼び出します。

SwiftObjective-C
Auth.auth().signIn(withEmail: email, password: password) { [weak self] authResult, error in
  guard let strongSelf = self else { return }
  // ...
}
[[FIRAuth auth] signInWithEmail:self->_emailField.text
                       password:self->_passwordField.text
                     completion:^(FIRAuthDataResult * _Nullable authResult,
                                  NSError * _Nullable error) {
  // ...
}];

ユーザー情報を取得する

ユーザーが正常にログインしたら、ユーザーに関する情報を取得できます。たとえば、認証状態リスナーで次のようにします。

SwiftObjective-C
if let user = user {
  // The user's ID, unique to the Firebase project.
  // Do NOT use this value to authenticate with your backend server,
  // if you have one. Use getTokenWithCompletion:completion: instead.
  let uid = user.uid
  let email = user.email
  let photoURL = user.photoURL
  var multiFactorString = "MultiFactor: "
  for info in user.multiFactor.enrolledFactors {
    multiFactorString += info.displayName ?? "[DispayName]"
    multiFactorString += " "
  }
  // ...
}
if (user) {
  // The user's ID, unique to the Firebase project.
  // Do NOT use this value to authenticate with your backend server,
  // if you have one. Use getTokenWithCompletion:completion: instead.
  NSString *email = user.email;
  NSString *uid = user.uid;
  NSMutableString *multiFactorString = [NSMutableString stringWithFormat:@"MultiFactor: "];
  for (FIRMultiFactorInfo *info in user.multiFactor.enrolledFactors) {
    [multiFactorString appendString:info.displayName];
    [multiFactorString appendString:@" "];
  }
  NSURL *photoURL = user.photoURL;
  // ...
}

次のステップ

他の ID プロバイダと匿名ゲスト アカウントのサポートを追加する方法を学びます。