Firebase Authentication を使用することで、ユーザーが Firebase での認証にメールアドレスとパスワードを使用できるようにし、アプリのパスワード ベースのアカウントを管理できます。
始める前に
Swift Package Manager を使用して Firebase の依存関係をインストールし、管理します。
- Xcode でアプリのプロジェクトを開いたまま、[File] > [Add Packages] の順に移動します。
- プロンプトが表示されたら、Firebase Apple プラットフォーム SDK リポジトリを追加します。
- Firebase Authentication ライブラリを選択します。
- ターゲットのビルド設定の [Other Linker Flags] セクションに -ObjCフラグを追加します。
- 上記の作業が完了すると、Xcode は依存関係の解決とバックグラウンドでのダウンロードを自動的に開始します。
https://github.com/firebase/firebase-ios-sdk.git
次に、以下の構成手順を行います。
- アプリを Firebase プロジェクトに接続していない場合は、Firebase コンソールで接続します。
- メールアドレスとパスワードによるログインを有効にします。
  - Firebase コンソールで [Auth] セクションを開きます。
- [Sign-in method] タブで [メール / パスワード] を有効にして、[保存] をクリックします。
 
パスワード ベースのアカウントを作成する
パスワードを使用して新しいユーザー アカウントを作成するには、アプリのログイン アクティビティで次の手順に沿って操作します。
- UIApplicationDelegateに- FirebaseCoreモジュールと、アプリのデリゲートが使用する他の Firebase モジュールをインポートします。たとえば、Cloud Firestore、Authentication を使用するには、次のように指定します。- SwiftUI- import SwiftUI import FirebaseCore import FirebaseFirestore import FirebaseAuth // ... - Swift- import FirebaseCore import FirebaseFirestore import FirebaseAuth // ... - Objective-C- @import FirebaseCore; @import FirebaseFirestore; @import FirebaseAuth; // ... 
- アプリ デリゲートの application(_:didFinishLaunchingWithOptions:)メソッドで、FirebaseApp共有インスタンスを構成します。SwiftUI// Use Firebase library to configure APIs FirebaseApp.configure() Swift// Use Firebase library to configure APIs FirebaseApp.configure() Objective-C// Use Firebase library to configure APIs [FIRApp configure]; 
- SwiftUI を使用している場合は、アプリケーション デリゲートを作成し、UIApplicationDelegateAdaptorまたはNSApplicationDelegateAdaptorを介してApp構造体に接続する必要があります。また、アプリ デリゲートのメソッドの実装入れ替えを無効にする必要があります。詳細については、SwiftUI の手順をご覧ください。SwiftUI@main struct YourApp: App { // register app delegate for Firebase setup @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate var body: some Scene { WindowGroup { NavigationView { ContentView() } } } } 
- 新しいユーザーがアプリの登録フォームを使用して登録したら、アプリで必要な新しいアカウントの検証手順(新しいアカウントのパスワードが正しく入力されていることや、パスワードの複雑さの要件を満たしているかの確認など)を行います。
- 新しいユーザーのメールアドレスとパスワードを createUserに渡して、新しいアカウントを作成します。新しいアカウントが正常に作成された場合、ユーザーがログインすると、コールバック メソッドに渡された結果オブジェクトから、ユーザーのアカウント データを取得できます。SwiftAuth.auth().createUser(withEmail: email, password: password) { authResult, error in // ... } Objective-C[[FIRAuth auth] createUserWithEmail:email password:password completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) { // ... }]; 
メールアドレスとパスワードを使用してユーザーのログインを行う
パスワードを使用したユーザーのログイン手順は、新しいアカウントの作成手順と似ています。アプリのログイン アクティビティで、次の手順を行います。
- UIApplicationDelegateに- FirebaseCoreモジュールと、アプリのデリゲートが使用する他の Firebase モジュールをインポートします。たとえば、Cloud Firestore、Authentication を使用するには、次のように指定します。- SwiftUI- import SwiftUI import FirebaseCore import FirebaseFirestore import FirebaseAuth // ... - Swift- import FirebaseCore import FirebaseFirestore import FirebaseAuth // ... - Objective-C- @import FirebaseCore; @import FirebaseFirestore; @import FirebaseAuth; // ... 
- アプリ デリゲートの application(_:didFinishLaunchingWithOptions:)メソッドで、FirebaseApp共有インスタンスを構成します。SwiftUI// Use Firebase library to configure APIs FirebaseApp.configure() Swift// Use Firebase library to configure APIs FirebaseApp.configure() Objective-C// Use Firebase library to configure APIs [FIRApp configure]; 
- SwiftUI を使用している場合は、アプリケーション デリゲートを作成し、UIApplicationDelegateAdaptorまたはNSApplicationDelegateAdaptorを介してApp構造体に接続する必要があります。また、アプリ デリゲートのメソッドの実装入れ替えを無効にする必要があります。詳細については、SwiftUI の手順をご覧ください。SwiftUI@main struct YourApp: App { // register app delegate for Firebase setup @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate var body: some Scene { WindowGroup { NavigationView { ContentView() } } } } 
- ユーザーがアプリにログインしたら、そのユーザーのメールアドレスとパスワードを signInに渡します。ユーザーが正常にログインすると、コールバック メソッドに渡された結果オブジェクトからユーザーのアカウント データを取得できます。SwiftAuth.auth().signIn(withEmail: email, password: password) { [weak self] authResult, error in guard let strongSelf = self else { return } // ... } Objective-C[[FIRAuth auth] signInWithEmail:self->_emailField.text password:self->_passwordField.text completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) { // ... }]; 
推奨: パスワード ポリシーを設定する
パスワードの複雑さの要件を適用することで、アカウントのセキュリティを強化できます。
プロジェクトのパスワード ポリシーを構成するには、Firebase コンソールの [認証設定] ページで [パスワード ポリシー] タブを開きます。
Firebase Authentication パスワード ポリシーは、次のパスワード要件をサポートしています。
- 小文字は必須です 
- 大文字は必須です 
- 数字は必須です 
- 英数字以外の文字は必須です - 次の文字は英数字以外の文字の要件を満たします: - ^ $ * . [ ] { } ( ) ? " ! @ # % & / \ , > < ' : ; | _ ~
- パスワードの最小文字数(6~30 文字。デフォルトは 6) 
- パスワードの最大文字数(最大 4,096 文字) 
パスワード ポリシーの適用は、次の 2 つのモードのいずれかを使用することで有効にできます。
- 必須: ユーザーがポリシーに準拠したパスワードに更新するまで、ログインの試行は失敗します。 
- 通知: ユーザーは遵守していないパスワードを使用してログインできます。このモードを使用する場合は、ユーザーのパスワードがクライアント側でポリシーに準拠しているかどうかを確認し、準拠していない場合はパスワードを更新するようユーザーになんらかの方法でプロンプトを表示する必要があります。 
新規ユーザーは、常にポリシーに準拠したパスワードを選択する必要があります。
アクティブなユーザーがいる場合は、パスワードがポリシーに準拠していないユーザーを意図的にブロックする場合を除き、ログイン時の必須適用を有効にしないことをおすすめします。代わりに、通知モードを使用します。これにより、ユーザーに現在のパスワードでログインさせて、現在のパスワードに欠けている要件を通知することができます。
推奨: メール列挙保護を有効にする
メールアドレスをパラメータとして受け取る Firebase Authentication メソッドの中には、メールアドレスが登録されている必要がある処理(たとえばメールアドレスとパスワードを使用してログインするなど)においてメールアドレスが未登録である場合、またはメールアドレスが未使用であることが必要な処理(たとえばユーザーのメールアドレスを変更するなど)においてメールアドレスが登録済みである場合に、特定のエラーをスローするものがあります。これは、ユーザーに具体的な解決策を提示するのに役立つ一方で、ユーザーが登録したメールアドレスを検出するために悪意のあるアクターによって悪用される可能性もあります。
このリスクを軽減するため、Google Cloud の gcloud ツールを使用して、プロジェクトでメール列挙保護を有効にすることをおすすめします。この機能を有効にすると Firebase Authentication のエラーレポートの動作が変わるため、アプリが具体的なエラーに依存しないように注意してください。
次のステップ
ユーザーが初めてログインすると、新しいユーザー アカウントが作成され、ユーザーがログイン時に使用した認証情報(ユーザー名とパスワード、電話番号、または認証プロバイダ情報)にアカウントがリンクされます。この新しいアカウントは Firebase プロジェクトの一部として保存され、ユーザーのログイン方法にかかわらず、プロジェクトのすべてのアプリでユーザーを識別するために使用できます。
- 
アプリでは、 Userオブジェクトからユーザーの基本的なプロフィール情報を取得できます。ユーザーを管理するをご覧ください。
- Firebase Realtime Database と Cloud Storage のセキュリティ ルールでは、ログイン済みユーザーの一意のユーザー ID を - auth変数から取得し、それを使用して、ユーザーがアクセスできるデータを制御できます。
既存のユーザー アカウントに認証プロバイダの認証情報をリンクすることで、ユーザーは複数の認証プロバイダを使用してアプリにログインできるようになります。
ユーザーのログアウトを行うには、signOut: を呼び出します。
Swift
let firebaseAuth = Auth.auth() do { try firebaseAuth.signOut() } catch let signOutError as NSError { print("Error signing out: %@", signOutError) }
Objective-C
NSError *signOutError; BOOL status = [[FIRAuth auth] signOut:&signOutError]; if (!status) { NSLog(@"Error signing out: %@", signOutError); return; }
さまざまな認証エラーに対応できるようにエラー処理コードを追加することもできます。エラーの処理をご覧ください。