Как выполнять аутентификацию с помощью SAML в веб-приложениях

Если вы перешли на версию Firebase Authentication with Identity Platform, вы можете аутентифицировать пользователей в Firebase с помощью поставщика идентификационной информации SAML по вашему выбору. Это позволяет использовать решение SSO на базе SAML для входа пользователей в приложение Firebase.

Firebase Authentication поддерживает только поток SAML, инициируемый поставщиком услуг.

Подготовка

Чтобы пользователи могли входить в систему с помощью поставщика идентификационной информации SAML, сначала необходимо получить от него следующую информацию:

  • Идентификатор объекта поставщика – URI, который идентифицирует поставщика идентификационной информации.
  • URL системы единого входа SAML поставщика – URL страницы входа поставщика идентификационной информации.
  • Сертификат открытого ключа поставщика. Сертификат, используемый для проверки токенов, подписанных поставщиком идентификационной информации.
  • Идентификатор объекта приложения – URI, который идентифицирует ваше приложение как поставщика услуг.

Когда у вас будет вся необходимая информация, включите SAML в качестве поставщика услуг входа для проекта Firebase:

  1. Добавьте Firebase в свой проект JavaScript.

  2. Если вы ещё не обновили проект до версии Firebase Authentication with Identity Platform, сделайте это. Аутентификация SAML доступна только в обновленных проектах.

  3. В консоли Firebase выберите Безопасность > Аутентификация.

  4. На вкладке Способ входа нажмите Добавить нового поставщика и выберите SAML.

  5. Укажите название поставщика. Запишите сгенерированный идентификатор поставщика, например saml.example-provider. Он понадобится вам, когда вы будете добавлять в приложение код для входа в аккаунт.

  6. Укажите идентификатор объекта, URL системы единого входа и сертификат открытого ключа поставщика идентификационной информации. Также укажите идентификатор объекта приложения (поставщика услуг). Эти значения должны в точности совпадать с теми, которые вам предоставил поставщик.

  7. Сохраните изменения.

  8. Если вы ещё не авторизовали домен приложения, сделайте следующее:

    1. В консоли Firebase выберите Безопасность > Аутентификация > вкладка Настройки.

    2. В разделе Авторизованные домены нажмите Добавить домен и добавьте свой домен.

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

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

  1. Создайте экземпляр SAMLAuthProvider, используя идентификатор поставщика, полученный в консоли Firebase.

    Web

    import { SAMLAuthProvider } from "firebase/auth";
    
    const provider = new SAMLAuthProvider('saml.example-provider');
    

    Web

    var provider = new firebase.auth.SAMLAuthProvider('saml.example-provider');
    ``
    
  1. Выполните аутентификацию с помощью Firebase, используя объект поставщика SAML.

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

    Переадресация

    Перенаправьте пользователя на страницу входа поставщика, вызвав функцию signInWithRedirect():

    Web

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

    Web

    firebase.auth().signInWithRedirect(provider);
    

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

    Web

    import { getAuth, getRedirectResult, SAMLAuthProvider } from "firebase/auth";
    
    const auth = getAuth();
    getRedirectResult(auth)
      .then((result) => {
        // User is signed in.
    
        // Provider data available using getAdditionalUserInfo()
      })
      .catch((error) => {
        // Handle error.
      });
    

    Web

    firebase.auth().getRedirectResult()
      .then((result) => {
        // User is signed in.
    
        // Provider data available in result.additionalUserInfo.profile,
        // or from the user's ID token obtained from result.user.getIdToken()
        // as an object in the firebase.sign_in_attributes custom claim.
      })
      .catch((error) => {
        // Handle error.
      });
    

    Всплывающее окно

    Web

    import { getAuth, signInWithPopup, OAuthProvider } from "firebase/auth";
    
    const auth = getAuth();
    signInWithPopup(auth, provider)
      .then((result) => {
        // User is signed in.
    
        // Provider data available in result.additionalUserInfo.profile,
        // or from the user's ID token obtained from result.user.getIdToken()
        // as an object in the firebase.sign_in_attributes custom claim.
      })
      .catch((error) => {
        // Handle error.
      });
    

    Web

    firebase.auth().signInWithPopup(provider)
      .then((result) => {
        // User is signed in.
    
        // Provider data available in result.additionalUserInfo.profile,
        // or from the user's ID token obtained from result.user.getIdToken()
        // as an object in the firebase.sign_in_attributes custom claim.
      })
      .catch((error) => {
        // Handle error.
      });
    

    Токен идентификации и объект UserInfo содержат адрес электронной почты пользователя, только если он указан в атрибуте NameID утверждения SAML от поставщика идентификационной информации:

    <Subject>
      <NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">test@email.com</NameID>
    </Subject>
    
  2. В приведенных выше примерах основное внимание уделяется процессам входа в систему, но вы можете использовать тот же шаблон, чтобы связать поставщика SAML с существующим пользователем с помощью linkWithRedirect() и linkWithPopup(), а также повторно аутентифицировать пользователя с помощью reauthenticateWithRedirect() и reauthenticateWithPopup(). Это можно использовать для получения новых учетных данных для конфиденциальных операций, требующих недавнего входа в систему.