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

既存のユーザー アカウントに認証プロバイダの認証情報をリンクすることで、ユーザーが複数の認証プロバイダを使用してアプリにログインできるようになります。ログインに使用した認証プロバイダに関係なく、同じ Firebase ユーザー ID でユーザーを識別できます。たとえば、パスワードを使用してログインしたユーザーが認証情報を Google アカウントにリンクすれば、それ以降はどちらの方法でもログインできるようになります。また、匿名ユーザーが認証情報を Facebook アカウントにリンクすると、それ以降は Facebook にログインしてアプリを使用できるようになります。

準備

アプリに複数の認証プロバイダ(匿名認証も含む)のサポートを追加します。

すべての API 呼び出しは FirebaseAuth クラスを使用して行われます。このクラスには FirebaseAuth.DefaultInstance を介してアクセスできます。
Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance;

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

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

  1. 任意の認証プロバイダや認証方法を使用してユーザーのログインを行います。
  2. 新しい認証プロバイダのログインフローを行います(ただし、いずれかの Firebase.Auth.FirebaseAuth.SignInWithCredentialAsync メソッドを呼び出す手前まで)。たとえば、ユーザーの Google ID トークン、Facebook アクセス トークン、またはメールとパスワードを取得します。
  3. 新しい認証プロバイダの Firebase.Auth.Credential を取得します。

    Google ログイン
    Firebase.Auth.Credential credential =
        Firebase.Auth.GoogleAuthProvider.GetCredential(googleIdToken, googleAccessToken);
    
    Facebook ログイン
    Firebase.Auth.Credential credential =
        Firebase.Auth.FacebookAuthProvider.GetCredential(accessToken);
    
    メールとパスワードによるログイン
    Firebase.Auth.Credential credential =
        Firebase.Auth.EmailAuthProvider.GetCredential(email, password);
    
  4. ログインしたユーザーの LinkWithCredentialAsync メソッドに Firebase.Auth.Credential オブジェクトを渡します。

    auth.CurrentUser.LinkWithCredentialAsync(credential).ContinueWith(task => {
      if (task.IsCanceled) {
        Debug.LogError("LinkWithCredentialAsync was canceled.");
        return;
      }
      if (task.IsFaulted) {
        Debug.LogError("LinkWithCredentialAsync encountered an error: " + task.Exception);
        return;
      }
    
      Firebase.Auth.FirebaseUser newUser = task.Result;
      Debug.LogFormat("Credentials successfully linked to Firebase user: {0} ({1})",
          newUser.DisplayName, newUser.UserId);
    });
    

    認証情報が別のユーザー アカウントにすでにリンクされている場合は、LinkWithCredentialAsync の呼び出しが失敗します。この場合は、アプリに適した方法でアカウントと関連データの統合を行う必要があります。

    // Gather data for the currently signed in User.
    string currentUserId = auth.CurrentUser.UserId;
    string currentEmail = auth.CurrentUser.Email;
    string currentDisplayName = auth.CurrentUser.DisplayName;
    System.Uri currentPhotoUrl = auth.CurrentUser.PhotoUrl;
    
    // Sign in with the new credentials.
    auth.SignInWithCredentialAsync(credential).ContinueWith(task => {
      if (task.IsCanceled) {
        Debug.LogError("SignInWithCredentialAsync was canceled.");
        return;
      }
      if (task.IsFaulted) {
        Debug.LogError("SignInWithCredentialAsync encountered an error: " + task.Exception);
        return;
      }
    
      Firebase.Auth.FirebaseUser newUser = task.Result;
      Debug.LogFormat("User signed in successfully: {0} ({1})",
          newUser.DisplayName, newUser.UserId);
    
      // TODO: Merge app specific details using the newUser and values from the
      // previous user, saved above.
    });
    

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

ユーザー アカウントから認証プロバイダのリンクを解除する

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

ユーザー アカウントから認証プロバイダのリンクを解除するには、プロバイダ ID を UnlinkAsync メソッドに渡します。ユーザーにリンクされた認証プロバイダのプロバイダ ID は、ProviderData を呼び出すことで取得できます。

// Unlink the sign-in provider from the currently active user.
// providerIdString is a string identifying a provider,
// retrieved via FirebaseAuth.FetchProvidersForEmail().
auth.CurrentUser.UnlinkAsync(providerIdString).ContinueWith(task => {
  if (task.IsCanceled) {
    Debug.LogError("UnlinkAsync was canceled.");
    return;
  }
  if (task.IsFaulted) {
    Debug.LogError("UnlinkAsync encountered an error: " + task.Exception);
    return;
  }

  // The user has been unlinked from the provider.
  Firebase.Auth.FirebaseUser newUser = task.Result;
  Debug.LogFormat("Credentials successfully unlinked from user: {0} ({1})",
      newUser.DisplayName, newUser.UserId);
});

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。