Google は、黒人コミュニティのための人種的公平の促進に取り組んでいます。詳細をご覧ください。

AndroidでYahooを使用して認証する

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

Firebase SDKを使用してウェブベースの汎用OAuthログインをアプリに統合し、エンドツーエンドのサインインフローを実行することで、YahooなどのOAuthプロバイダーを使用してユーザーにFirebaseで認証を許可できます。

あなたが始める前に

Yahooアカウントを使用してユーザーにログインするには、まずYahooをFirebaseプロジェクトのログインプロバイダーとして有効にする必要があります。

  1. AndroidプロジェクトにFirebaseを追加します

  2. Firebaseコンソールで、[認証]セクションを開きます。
  3. [サインイン方法]タブで、 Yahooプロバイダーを有効にします。
  4. そのプロバイダーの開発者コンソールからプロバイダー構成にクライアントIDクライアントシークレットを追加します。
    1. Yahoo OAuthクライアントを登録するには、YahooにWebアプリケーションを登録する際のYahoo開発者向けドキュメントに従ってください。

      profileemailの2つのOpenIDConnectAPI権限を必ず選択してください。

    2. これらのプロバイダーにアプリを登録するときは、プロジェクトの*.firebaseapp.comドメインをアプリのリダイレクトドメインとして必ず登録してください。
  5. [保存]をクリックします。
  6. アプリのSHA-1フィンガープリントをまだ指定していない場合は、Firebaseコンソールの[設定]ページから指定してください。アプリのSHA-1フィンガープリントを取得する方法の詳細については、クライアントの認証を参照してください。

FirebaseSDKを使用してログインフローを処理する

Androidアプリを構築している場合、Yahooアカウントを使用してFirebaseでユーザーを認証する最も簡単な方法は、FirebaseAndroidSDKでログインフロー全体を処理することです。

Firebase Android SDKでログインフローを処理するには、次の手順に従います。

  1. プロバイダーIDyahoo.comビルダーを使用してOAuthProviderのインスタンスを構築します。

    OAuthProvider.Builder provider = OAuthProvider.newBuilder("yahoo.com");
    
  2. オプション:OAuthリクエストで送信する追加のカスタムOAuthパラメーターを指定します。

    // Prompt user to re-authenticate to Yahoo.
    provider.addCustomParameter("prompt", "login");
    
    // Localize to French.
    provider.addCustomParameter("language", "fr");
    

    Yahooがサポートするパラメーターについては、 YahooOAuthのドキュメントを参照してください。 setCustomParameters()を使用してFirebaseに必要なパラメータを渡すことはできないことに注意してください。これらのパラメーターは、 client_idredirect_uriresponse_typescopestateです。

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

    List<String> scopes =
        new ArrayList<String>() {
          {
            // Request access to Yahoo Mail API.
            add("mail-r");
            // This must be preconfigured in the app's API permissions.
            add("sdct-w");
          }
        };
    provider.setScopes(scopes);
    

    詳細については、 Yahooスコープのドキュメントを参照してください。

  4. OAuthプロバイダーオブジェクトを使用してFirebaseで認証します。他のFirebaseAuth操作とは異なり、これはカスタムChromeタブをポップアップすることでUIを制御することに注意してください。そのため、操作がUIを開始するとすぐに切り離されるため、アタッチするOnSuccessListenersおよびOnFailureListenersでアクティビティを参照しないでください。

    最初に、すでに応答を受け取っているかどうかを確認する必要があります。この方法でサインインすると、アクティビティがバックグラウンドで実行されます。つまり、サインインフロー中にシステムによってアクティビティを再利用できます。これが発生した場合にユーザーに再試行させないようにするために、結果がすでに存在するかどうかを確認する必要があります。

    保留中の結果があるかどうかを確認するには、 getPendingAuthResultを呼び出します。

    FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
    Task<AuthResult> pendingResultTask = firebaseAuth.getPendingAuthResult();
    if (pendingResultTask != null) {
      // There's something already here! Finish the sign-in for your user.
      pendingResultTask
          .addOnSuccessListener(
              new OnSuccessListener<AuthResult>() {
                @Override
                public void onSuccess(AuthResult authResult) {
                  // User is signed in.
                  // IdP data available in
                  // authResult.getAdditionalUserInfo().getProfile().
                  // The OAuth access token can also be retrieved:
                  // ((OAuthCredential)authResult.getCredential()).getAccessToken().
                  // Yahoo OAuth ID token can be retrieved:
                  // ((OAuthCredential)authResult.getCredential()).getIdToken().
                }
              })
          .addOnFailureListener(
              new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                  // Handle failure.
                }
              });
    } else {
      // There's no pending result so you need to start the sign-in flow.
      // See below.
    }
    

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

    firebaseAuth
        .startActivityForSignInWithProvider(/* activity= */ this, provider.build())
        .addOnSuccessListener(
            new OnSuccessListener<AuthResult>() {
              @Override
              public void onSuccess(AuthResult authResult) {
                // User is signed in.
                // IdP data available in
                // authResult.getAdditionalUserInfo().getProfile().
                // The OAuth access token can be retrieved:
                // ((OAuthCredential)authResult.getCredential()).getAccessToken().
                // Yahoo OAuth ID token can also be retrieved:
                // ((OAuthCredential)authResult.getCredential()).getIdToken().
              }
            })
        .addOnFailureListener(
            new OnFailureListener() {
              @Override
              public void onFailure(@NonNull Exception e) {
                // Handle failure.
              }
            });
    

    正常に完了すると、プロバイダーに関連付けられたOAuthアクセストークンを、返されたOAuthCredentialオブジェクトから取得できます。

    OAuthアクセストークンを使用して、 YahooAPIを呼び出すことができます。

    ここで、 YAHOO_USER_UIDは、firebaseAuth.getCurrentUser firebaseAuth.getCurrentUser().getProviderData().get(0).getUid()フィールドまたはauthResult.getAdditionalUserInfo().getProfile()から解析できるYahooユーザーのIDです。

  5. 上記の例はサインインフローに焦点を当てていますが、 startActivityForLinkWithProviderを使用してYahooプロバイダーを既存のユーザーにリンクすることもできます。たとえば、複数のプロバイダーを同じユーザーにリンクして、どちらかでサインインできるようにすることができます。

    // The user is already signed-in.
    FirebaseUser firebaseUser = firebaseAuth.getCurrentUser();
    
    firebaseUser
        .startActivityForLinkWithProvider(/* activity= */ this, provider.build())
        .addOnSuccessListener(
            new OnSuccessListener<AuthResult>() {
              @Override
              public void onSuccess(AuthResult authResult) {
                // Yahoo credential is linked to the current user.
                // IdP data available in
                // authResult.getAdditionalUserInfo().getProfile().
                // The OAuth access token can be retrieved:
                // authResult.getCredential().getAccessToken().
                // Yahoo OAuth ID token can also be retrieved:
                // authResult.getCredential().getIdToken().
              }
            })
        .addOnFailureListener(
            new OnFailureListener() {
              @Override
              public void onFailure(@NonNull Exception e) {
                // Handle failure.
              }
            });
    
  6. 同じパターンをstartActivityForReauthenticateWithProviderで使用できます。これを使用して、最近のログインを必要とする機密性の高い操作の新しい資格情報を取得できます。

    // The user is already signed-in.
    FirebaseUser firebaseUser = firebaseAuth.getCurrentUser();
    
    firebaseUser
        .startActivityForReauthenticateWithProvider(/* activity= */ this, provider.build())
        .addOnSuccessListener(
            new OnSuccessListener<AuthResult>() {
              @Override
              public void onSuccess(AuthResult authResult) {
                // User is re-authenticated with fresh tokens and
                // should be able to perform sensitive operations
                // like account deletion and email or password
                // update.
              }
            })
        .addOnFailureListener(
            new OnFailureListener() {
              @Override
              public void onFailure(@NonNull Exception e) {
                // Handle failure.
              }
            });
    

次のステップ

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

  • アプリでは、 FirebaseUserオブジェクトからユーザーの基本的なプロファイル情報を取得できます。ユーザーの管理を参照してください。

  • FirebaseRealtimeデータベースとCloudStorageのセキュリティルールでは、ログインしたユーザーの一意のユーザーIDをauth変数から取得し、それを使用してユーザーがアクセスできるデータを制御できます。

認証プロバイダーのクレデンシャルを既存のユーザーアカウントにリンクすることで、ユーザーが複数の認証プロバイダーを使用してアプリにサインインできるようにすることができます。

ユーザーをサインアウトするには、 signOutを呼び出します。

Java

FirebaseAuth.getInstance().signOut();

Kotlin+KTX

Firebase.auth.signOut()