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

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

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

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

あなたが始める前に

Microsoftアカウント(Azure Active Directoryおよび個人のMicrosoftアカウント)を使用してユーザーにサインインするには、最初にFirebaseプロジェクトのサインインプロバイダーとしてMicrosoftを有効にする必要があります。

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

  2. Firebaseコンソールで、[認証]セクションを開きます。
  3. [サインイン方法]タブで、 Microsoftプロバイダーを有効にします。
  4. そのプロバイダーの開発者コンソールからプロバイダー構成にクライアントIDクライアントシークレットを追加します。
    1. Microsoft OAuthクライアントを登録するには、クイックスタートの手順に従います。AzureActiveDirectoryv2.0エンドポイントにアプリを登録します。このエンドポイントは、Microsoftの個人アカウントとAzureActiveDirectoryアカウントを使用したサインインをサポートしていることに注意してください。 Azure ActiveDirectoryv2.0の詳細をご覧ください
    2. これらのプロバイダーにアプリを登録するときは、プロジェクトの*.firebaseapp.comドメインをアプリのリダイレクトドメインとして必ず登録してください。
  5. [保存]をクリックします。
  6. アプリのSHA-1フィンガープリントをまだ指定していない場合は、Firebaseコンソールの[設定]ページから指定してください。アプリのSHA-1フィンガープリントを取得する方法の詳細については、クライアントの認証を参照してください。

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

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

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

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

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

    // Force re-consent.
    provider.addCustomParameter("prompt", "consent");
    
    // Target specific email with login hint.
    provider.addCustomParameter("login_hint", "user@firstadd.onmicrosoft.com");
    

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

    特定のAzureADテナントのユーザーのみがアプリケーションにサインインできるようにするには、AzureADテナントのフレンドリドメイン名またはテナントのGUID識別子のいずれかを使用できます。これは、カスタムパラメータオブジェクトの「テナント」フィールドを指定することで実行できます。

    // Optional "tenant" parameter in case you are using an Azure AD tenant.
    // eg. '8eaef023-2b34-4da1-9baa-8bc8c9d6a490' or 'contoso.onmicrosoft.com'
    // or "common" for tenant-independent tokens.
    // The default value is "common".
    provider.addCustomParameter("tenant", "TENANT_ID");
    
  3. オプション:認証プロバイダーに要求する基本プロファイル以外の追加のOAuth2.0スコープを指定します。

    List<String> scopes =
        new ArrayList<String>() {
          {
            add("mail.read");
            add("calendars.read");
          }
        };
    provider.setScopes(scopes);
    

    詳細については、 Microsoftのアクセス許可と同意のドキュメントを参照してください。

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

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

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

    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().
                  // The OAuth ID token can also 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 also be retrieved:
                // authResult.getCredential().getAccessToken().
                // The OAuth ID token can also be retrieved:
                // authResult.getCredential().getIdToken().
              }
            })
        .addOnFailureListener(
            new OnFailureListener() {
              @Override
              public void onFailure(@NonNull Exception e) {
                // Handle failure.
              }
            });
    

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

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

    Firebase Authでサポートされている他のプロバイダーとは異なり、Microsoftは写真のURLを提供していません。代わりに、プロフィール写真のバイナリデータをMicrosoftGraphAPIを介してリクエストする必要があります。

    OAuthアクセストークンに加えて、ユーザーのOAuthIDトークンOAuthCredentialオブジェクトから取得することもできます。 IDトークンのsubクレームはアプリ固有であり、Firebase Authで使用され、 user.getProviderData().get(0).getUid()を介してアクセスできるフェデレーションユーザー識別子とは一致しません。代わりに、 oidクレームフィールドを使用する必要があります。 Azure ADテナントを使用してサインインする場合、 oidクレームは完全に一致します。ただし、非テナントの場合、 oidフィールドはパディングされます。フェデレーション4b2eabcdefghijklの場合、 oidの形式は00000000-0000-0000-4b2e-abcdefghijklなります。

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

    // 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) {
                // Microsoft credential is linked to the current user.
                // IdP data available in
                // authResult.getAdditionalUserInfo().getProfile().
                // The OAuth access token can also be retrieved:
                // authResult.getCredential().getAccessToken().
                // The 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()