Аутентификация с помощью Microsoft с использованием JavaScript

Вы можете разрешить пользователям проходить аутентификацию в Firebase с помощью поставщиков OAuth, таких как Microsoft Azure Active Directory. Для этого интегрируйте в приложение общий вход через OAuth с помощью Firebase SDK, чтобы реализовать сквозной процесс входа.

Подготовка

Чтобы пользователи могли входить в систему с помощью аккаунтов Microsoft (Azure Active Directory и личных аккаунтов Microsoft), сначала включите Microsoft в качестве поставщика услуг входа для своего проекта Firebase:

  1. Добавьте Firebase в свой проект JavaScript.
  2. В консоли Firebase выберите Безопасность > Аутентификация.
  3. На вкладке Способ входа включите поставщика для входа через Microsoft.
  4. Добавьте идентификатор клиента и секретный код клиента из консоли разработчика поставщика в конфигурацию поставщика:
    1. Чтобы зарегистрировать клиент OAuth Microsoft, следуйте инструкциям в руководстве по регистрации приложения с конечной точкой Azure Active Directory версии 2.0. Обратите внимание, что эта конечная точка поддерживает вход с использованием личных аккаунтов Microsoft, а также аккаунтов Azure Active Directory. Подробнее о Azure Active Directory версии 2.0…
    2. При регистрации приложений у этих поставщиков обязательно укажите домен *.firebaseapp.com для своего проекта в качестве домена переадресации для приложения.
  5. Нажмите Сохранить.

Как обрабатывать процесс входа с помощью Firebase SDK

Если вы создаете веб-приложение, самый простой способ аутентификации пользователей с помощью аккаунтов Microsoft в Firebase – реализовать весь процесс входа с помощью Firebase JavaScript SDK.

Чтобы реализовать процесс входа с помощью Firebase JavaScript SDK, выполните следующие действия:

  1. Создайте экземпляр OAuthProvider, используя идентификатор поставщика microsoft.com.

    Web

    import { OAuthProvider } from "firebase/auth";
    
    const provider = new OAuthProvider('microsoft.com');

    Web

    var provider = new firebase.auth.OAuthProvider('microsoft.com');
  2. Необязательно. Укажите дополнительные специальные параметры OAuth, которые вы хотите отправить с запросом OAuth.

    Web

    provider.setCustomParameters({
      // Force re-consent.
      prompt: 'consent',
      // Target specific email with login hint.
      login_hint: 'user@firstadd.onmicrosoft.com'
    });

    Web

    provider.setCustomParameters({
      // Force re-consent.
      prompt: 'consent',
      // Target specific email with login hint.
      login_hint: 'user@firstadd.onmicrosoft.com'
    });

    Параметры, поддерживаемые Microsoft, описаны в документации по Microsoft OAuth. Обратите внимание, что с помощью setCustomParameters() нельзя передавать параметры, обязательные для Firebase. Это параметры client_id, response_type, redirect_uri, state, scope и response_mode.

    Чтобы разрешить вход в приложение только пользователям определенного клиента Azure AD, можно использовать понятное доменное имя клиента Azure AD или его глобальный уникальный идентификатор. Для этого укажите поле tenant в объекте специальных параметров.

    Web

    provider.setCustomParameters({
      // 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".
      tenant: 'TENANT_ID'
    });

    Web

    provider.setCustomParameters({
      // 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".
      tenant: 'TENANT_ID'
    });
  3. Необязательно. Укажите дополнительные области действия OAuth 2.0, помимо базового профиля, которые вы хотите запросить у поставщика услуг аутентификации.

    provider.addScope('mail.read');
    provider.addScope('calendars.read');

    Подробнее о разрешениях и согласии Microsoft…

  4. Выполните аутентификацию в Firebase, используя объект поставщика OAuth. Вы можете предложить пользователям войти в аккаунт Microsoft, открыв всплывающее окно или перенаправив их на страницу входа. На мобильных устройствах рекомендуется использовать метод переадресации.

    • Чтобы войти в систему с помощью всплывающего окна, вызовите функцию signInWithPopup:

    Web

    import { getAuth, signInWithPopup, OAuthProvider } from "firebase/auth";
    
    const auth = getAuth();
    signInWithPopup(auth, provider)
      .then((result) => {
        // User is signed in.
        // IdP data available in result.additionalUserInfo.profile.
    
        // Get the OAuth access token and ID Token
        const credential = OAuthProvider.credentialFromResult(result);
        const accessToken = credential.accessToken;
        const idToken = credential.idToken;
      })
      .catch((error) => {
        // Handle error.
      });

    Web

    firebase.auth().signInWithPopup(provider)
      .then((result) => {
        // IdP data available in result.additionalUserInfo.profile.
        // ...
    
        /** @type {firebase.auth.OAuthCredential} */
        var credential = result.credential;
    
        // OAuth access and id tokens can also be retrieved:
        var accessToken = credential.accessToken;
        var idToken = credential.idToken;
      })
      .catch((error) => {
        // Handle error.
      });
    • Чтобы войти в аккаунт, перейдя на страницу входа, вызовите signInWithRedirect:

    При использовании signInWithRedirect, linkWithRedirect или reauthenticateWithRedirect следуйте рекомендациям.

    Web

    import { getAuth, signInWithRedirect } from "firebase/auth";
    
    const auth = getAuth();
    signInWithRedirect(auth, provider);

    Web

    firebase.auth().signInWithRedirect(provider);

    После того как пользователь выполнит вход и вернется на страницу, вы можете получить результат входа, вызвав функцию getRedirectResult.

    Web

    import { getAuth, getRedirectResult, OAuthProvider } from "firebase/auth";
    
    const auth = getAuth();
    getRedirectResult(auth)
      .then((result) => {
        // User is signed in.
        // IdP data available in result.additionalUserInfo.profile.
    
        // Get the OAuth access token and ID Token
        const credential = OAuthProvider.credentialFromResult(result);
        const accessToken = credential.accessToken;
        const idToken = credential.idToken;
      })
      .catch((error) => {
        // Handle error.
      });

    Web

    firebase.auth().getRedirectResult()
      .then((result) => {
        // IdP data available in result.additionalUserInfo.profile.
        // ...
    
        /** @type {firebase.auth.OAuthCredential} */
        var credential = result.credential;
    
        // OAuth access and id tokens can also be retrieved:
        var accessToken = credential.accessToken;
        var idToken = credential.idToken;
      })
      .catch((error) => {
        // Handle error.
      });

    После успешного завершения токен доступа OAuth, связанный с поставщиком, можно получить из возвращенного объекта firebase.auth.UserCredential.

    С помощью токена доступа OAuth можно вызвать Microsoft Graph API.

    Например, чтобы получить основную информацию профиля, можно вызвать следующий REST API:

    curl -i -H "Authorization: Bearer ACCESS_TOKEN" https://graph.microsoft.com/v1.0/me

    В отличие от других поставщиков, поддерживаемых Firebase Auth, Microsoft не предоставляет URL фотографии. Вместо этого двоичные данные для фотографии профиля необходимо запросить через Microsoft Graph API.

    Помимо токена доступа OAuth, из объекта firebase.auth.UserCredential можно также получить токен идентификации OAuth пользователя. Заявление sub в токене идентификатора относится к приложению и не совпадает с идентификатором федеративного пользователя, который используется Firebase Auth и доступен через user.providerData[0].uid. Вместо него следует использовать поле oid. При входе с использованием клиента Azure AD утверждение oid будет точным. Однако в случае, когда клиент не является арендатором, поле oid дополняется. Для федеративного идентификатора 4b2eabcdefghijkl значение oid будет иметь формат 00000000-0000-0000-4b2e-abcdefghijkl.

  5. В приведенных выше примерах основное внимание уделяется процессам входа в систему, но вы также можете связать поставщика Microsoft с существующим пользователем, используя linkWithPopup/linkWithRedirect. Например, вы можете связать нескольких поставщиков с одним и тем же пользователем, чтобы он мог входить в систему с помощью любого из них.

    Web

    import { getAuth, linkWithPopup, OAuthProvider } from "firebase/auth";
    
    const provider = new OAuthProvider('microsoft.com');
    const auth = getAuth();
    
    linkWithPopup(auth.currentUser, provider)
        .then((result) => {
          // Microsoft credential is linked to the current user.
          // IdP data available in result.additionalUserInfo.profile.
    
          // Get the OAuth access token and ID Token
          const credential = OAuthProvider.credentialFromResult(result);
          const accessToken = credential.accessToken;
          const idToken = credential.idToken;
        })
        .catch((error) => {
          // Handle error.
        });

    Web

    var provider = new firebase.auth.OAuthProvider('microsoft.com');
    firebase.auth().currentUser.linkWithPopup(provider)
        .then((result) => {
          // Microsoft credential is linked to the current user.
          // IdP data available in result.additionalUserInfo.profile.
          // OAuth access token can also be retrieved:
          // result.credential.accessToken
          // OAuth ID token can also be retrieved:
          // result.credential.idToken
        })
        .catch((error) => {
          // Handle error.
        });
  6. Аналогичный шаблон можно использовать с reauthenticateWithPopup/reauthenticateWithRedirect, чтобы получать новые учетные данные для операций, связанных с безопасностью и требующих недавнего входа в систему.

    Web

    import { getAuth, reauthenticateWithPopup, OAuthProvider } from "firebase/auth";
    
    const provider = new OAuthProvider('microsoft.com');
    const auth = getAuth();
    reauthenticateWithPopup(auth.currentUser, provider)
        .then((result) => {
          // User is re-authenticated with fresh tokens minted and
          // should be able to perform sensitive operations like account
          // deletion and email or password update.
          // IdP data available in result.additionalUserInfo.profile.
    
          // Get the OAuth access token and ID Token
          const credential = OAuthProvider.credentialFromResult(result);
          const accessToken = credential.accessToken;
          const idToken = credential.idToken;
        })
        .catch((error) => {
          // Handle error.
        });

    Web

    var provider = new firebase.auth.OAuthProvider('microsoft.com');
    firebase.auth().currentUser.reauthenticateWithPopup(provider)
        .then((result) => {
          // User is re-authenticated with fresh tokens minted and
          // should be able to perform sensitive operations like account
          // deletion and email or password update.
          // IdP data available in result.additionalUserInfo.profile.
          // OAuth access token can also be retrieved:
          // result.credential.accessToken
          // OAuth ID token can also be retrieved:
          // result.credential.idToken
        })
        .catch((error) => {
          // Handle error.
        });

Как пройти аутентификацию с помощью Firebase в расширении Chrome

Если вы создаете приложение для расширения Chrome, ознакомьтесь с руководством по работе с документами вне экрана.

Дальнейшие действия

После первого входа пользователя создается новый аккаунт, связанный с учетными данными, которые он использовал (именем пользователя и паролем, номером телефона или информацией поставщика услуг аутентификации). Этот новый аккаунт хранится в проекте Firebase и позволяет идентифицировать пользователя во всех приложениях проекта независимо от того, как он вошел в аккаунт.

  • В приложениях рекомендуется отслеживать статус аутентификации пользователя, установив наблюдатель для объекта Auth. Затем вы можете получить основную информацию о профиле пользователя из объекта User. Подробнее о том, как управлять пользователями…

  • В Firebase Realtime Database и Cloud Storage правилах безопасности можно получить уникальный идентификатор пользователя, выполнившего вход, из переменной auth и использовать его, чтобы контролировать, к каким данным у пользователя есть доступ.

Вы можете разрешить пользователям входить в ваше приложение, используя несколько поставщиков услуг аутентификации, связав учетные данные поставщика услуг аутентификации с существующим аккаунтом пользователя.

Чтобы выйти из аккаунта пользователя, вызовите функцию signOut:

Web

import { getAuth, signOut } from "firebase/auth";

const auth = getAuth();
signOut(auth).then(() => {
  // Sign-out successful.
}).catch((error) => {
  // An error happened.
});

Web

firebase.auth().signOut().then(() => {
  // Sign-out successful.
}).catch((error) => {
  // An error happened.
});