Google I/O 2022 で発表された Firebase の最新情報をご覧ください。詳細

複数の認証プロバイダーをアカウントにリンクする

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

認証プロバイダーのクレデンシャルを既存のユーザーアカウントにリンクすることで、ユーザーが複数の認証プロバイダーを使用してアプリにサインインできるようにすることができます。ユーザーは、ログインに使用した認証プロバイダーに関係なく、同じFirebaseユーザーIDで識別できます。たとえば、パスワードを使用してログインしたユーザーは、Googleアカウントをリンクし、将来的にどちらの方法でもログインできます。または、匿名ユーザーがFacebookアカウントをリンクし、後でFacebookでサインインして、アプリの使用を継続することもできます。

あなたが始める前に

2つ以上の認証プロバイダー(匿名認証を含む可能性があります)のサポートをアプリに追加します。

認証プロバイダーの資格情報を既存のユーザーアカウントにリンクするには:

  1. 任意の認証プロバイダーまたは方法を使用してユーザーにサインインします。

  2. signInWithメソッドの1つを呼び出すまで、ただしこれを含まない、新しい認証プロバイダーのサインインフローを完了します。たとえば、ユーザーのGoogle IDトークン、Facebookアクセストークン、または電子メールとパスワードを取得します。

  3. 新しい認証プロバイダーのCredentialオブジェクトを取得します。

    // Google Sign-in
    final credential = GoogleAuthProvider.credential(idToken: idToken);
    
    // Email and password sign-in
    final credential =
        EmailAuthProvider.credential(email: emailAddress, password: password);
    
    // Etc.
    
  4. CredentialオブジェクトをサインインユーザーのlinkWithCredential()メソッドに渡します。

    try {
      final userCredential = await FirebaseAuth.instance.currentUser
          ?.linkWithCredential(credential);
    } on FirebaseAuthException catch (e) {
      switch (e.code) {
        case "provider-already-linked":
          print("The provider has already been linked to the user.");
          break;
        case "invalid-credential":
          print("The provider's credential is not valid.");
          break;
        case "credential-already-in-use":
          print("The account corresponding to the credential already exists, "
              "or is already linked to a Firebase User.");
          break;
        // See the API reference for the full list of error codes.
        default:
          print("Unknown error.");
      }
      ```
    

linkWithCredential()の呼び出しが成功すると、ユーザーはリンクされた認証プロバイダーを使用してサインインし、同じFirebaseデータにアクセスできるようになります。

アカウントから認証プロバイダーのリンクを解除して、ユーザーがそのプロバイダーでサインインできないようにすることができます。

ユーザーアカウントから認証プロバイダーのリンクを解除するには、プロバイダーIDをunlink()メソッドに渡します。 UserオブジェクトのproviderDataプロパティから、ユーザーにリンクされている認証プロバイダーのプロバイダーIDを取得できます。

try {
  await FirebaseAuth.instance.currentUser?.unlink(providerId);
} on FirebaseAuthException catch (e) {
  switch (e.code) {
    case "no-such-provider":
      print("The user isn't linked to the provider or the provider "
          "doesn't exist.");
      break;
    default:
      print("Unkown error.");
  }
}