Yahoo と Unity を使用して認証する

Firebase SDK を使用してウェブベースの汎用 OAuth ログインをアプリに統合し、エンドツーエンドのログインフローを実行することで、ユーザーが Firebase での認証に Yahoo などの OAuth プロバイダを使用できるようになります。このフローでは、スマートフォン ベースの Firebase SDK を使用する必要があるため、Android プラットフォームと iOS プラットフォームでのみサポートされます。

準備

Firebase Authentication を使用するには、次の作業が必要です。

  • Firebase を使用するように Unity プロジェクトを登録して構成する。

    • Unity プロジェクトですでに Firebase を使用している場合、この登録と構成はすでに行われています。

    • Unity プロジェクトがない場合は、サンプルアプリをダウンロードできます。

  • Unity プロジェクトに Firebase Unity SDK(具体的には FirebaseAuth.unitypackage)を追加する。

Firebase を Unity プロジェクトに追加するには、Firebase コンソールと開いている Unity プロジェクトの両方でタスクを行う必要があります(コンソールから Firebase 構成ファイルをダウンロードし、それを Unity プロジェクトに移動するなど)。

Firebase.Auth.FirebaseAuth クラスへのアクセス

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

Firebase SDK を使用したログインフローの処理

Firebase SDK でログインフローを処理する手順は次のとおりです。

  1. Yahoo に適したプロバイダ ID で構成された FederatedOAuthProviderData のインスタンスを作成します。

    Firebase.Auth.FederatedOAuthProviderData providerData =
      new Firebase.Auth.FederatedOAuthProviderData();
    providerData.ProviderId = Firebase.Auth.YahooAuthProvider.ProviderId;
    
  2. 省略可: OAuth リクエストと一緒に送信したい追加のカスタム OAuth パラメータを指定します。

    providerData.CustomParameters = new Dictionary<string,string>;
    
    // Prompt user to re-authenticate to Yahoo.
    providerData.CustomParameters.Add("prompt", "login");
    
    // Localize to French.
    providerData.CustomParameters.Add("language", "fr");
    

    Yahoo がサポートするパラメータについては、Yahoo の OAuth に関するドキュメントをご覧ください。custom_parameters() で Firebase の必須のパラメータを渡すことはできません。該当するパラメータは、client_idredirect_uriresponse_typescopestate です。

  3. 省略可: 認証プロバイダにリクエストする、profileemail を超える追加の OAuth 2.0 スコープを指定します。アプリケーションで Yahoo API から限定公開のユーザーデータへのアクセスが必要な場合は、Yahoo のデベロッパー コンソールの [API Permissions] で、Yahoo API に権限をリクエストする必要があります。リクエストされた OAuth スコープは、アプリの API 権限で事前構成されたものと完全一致する必要があります。たとえば、読み取り / 書き込みアクセスがユーザーの連絡先にリクエストされ、それがアプリの API 権限で事前構成されている場合は、読み取り専用の OAuth スコープ sdct-r の代わりに sdct-w を渡す必要があります。そうでなければ、フローは失敗し、エンドユーザーにエラーが表示されます。

    providerData.Scopes = new List<string>();
    
    // Request access to Yahoo Mail API.
    providerData.Scopes.Add("mail-r");
    // This must be preconfigured in the app's API permissions.
    providerData.Scopes.Add("sdct-w");
    

    詳しくは、Yahoo のスコープに関するドキュメントをご覧ください。

  4. プロバイダのデータを設定したら、それを使用して FederatedOAuthProvider を作成します。

    // Construct a FederatedOAuthProvider for use in Auth methods.
    Firebase.Auth.FederatedOAuthProvider provider =
        new Firebase.Auth.FederatedOAuthProvider();
    provider.SetProviderData(providerData);
    
  5. Auth プロバイダ オブジェクトを使用して Firebase での認証を行います。こうすると、他の FirebaseAuth オペレーションとは異なり、ユーザーが認証情報を入力できるウェブビューをポップアップ表示して UI を制御することになります。

    ログインフローを開始するには、SignInWithProviderAsync を呼び出します。

<<../_includes/_sign_in_with_provider_unity.md>>>

  1. 上記の例ではログインフローを中心に説明していますが、LinkWithProviderAsync を使用して Yahoo プロバイダを既存のユーザーにリンクすることもできます。たとえば、複数のプロバイダを同じユーザーにリンクして、どれでもログインを可能にできます。

    user.LinkWithProviderAsync(provider).ContinueOnMainThread(task => {
        if (task.IsCanceled) {
            Debug.LogError("LinkWithProviderAsync was canceled.");
            return;
        }
        if (task.IsFaulted) {
            Debug.LogError("LinkWithProviderAsync encountered an error: "
              + task.Exception);
            return;
        }
    
        Firebase.Auth.SignInResult signInResult = task.Result;
        Firebase.Auth.FirebaseUser user = signInResult.User;
        Debug.LogFormat("User linked successfully: {0} ({1})",
            user.DisplayName, user.UserId);
    });
    
  2. 同じパターンを ReauthenticateWithProviderAsync でも使用できます。これは、ログインしてから短時間のうちに行うべき機密性の高い操作のために、最新の認証情報を取得するのに使われます。

    user.ReauthenticateWithProviderAsync(provider).ContinueOnMainThread(task => {
        if (task.IsCanceled) {
            Debug.LogError("ReauthenticateWithProviderAsync was canceled.");
            return;
        }
        if (task.IsFaulted) {
            Debug.LogError(
            "ReauthenticateWithProviderAsync encountered an error: " +
                task.Exception);
            return;
        }
    
        Firebase.Auth.SignInResult signInResult = task.Result;
        Firebase.Auth.FirebaseUser user = signInResult.User;
        Debug.LogFormat("User reauthenticated successfully: {0} ({1})",
            user.DisplayName, user.UserId);
    });
    

次のステップ

ユーザーが初めてログインすると、新しいユーザー アカウントが作成され、ユーザーがログインに使用した認証情報(ユーザー名とパスワード、電話番号、または認証プロバイダ情報)にアカウントがリンクされます。この新しいアカウントは Firebase プロジェクトの一部として保存され、ユーザーのログイン方法にかかわらず、プロジェクトのすべてのアプリでユーザーを識別するために使用できます。

  • アプリでは、Firebase.Auth.FirebaseUser オブジェクトからユーザーの基本的なプロフィール情報を取得できます。

    Firebase.Auth.FirebaseUser user = auth.CurrentUser;
    if (user != null) {
      string name = user.DisplayName;
      string email = user.Email;
      System.Uri photo_url = user.PhotoUrl;
      // 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 User.TokenAsync() instead.
      string uid = user.UserId;
    }
    
  • Firebase Realtime Database と Cloud Storage のセキュリティ ルールでは、ログイン済みユーザーの一意のユーザー ID を auth 変数から取得し、それを使用して、ユーザーがアクセスできるデータを管理できます。

既存のユーザー アカウントに認証プロバイダの認証情報をリンクすることで、ユーザーは複数の認証プロバイダを使用してアプリにログインできるようになります。

ユーザーのログアウトを行うには、SignOut() を呼び出します。

auth.SignOut();