Аутентификация с помощью Microsoft на платформах Apple

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

Подготовка

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

  1. Добавьте Firebase в свой проект Apple.
  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

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

  1. Добавьте в проект Xcode специальные схемы URL:

    1. Откройте конфигурацию проекта: дважды нажмите на название проекта в древовидном представлении слева. Выберите приложение в разделе ЦЕЛЕВЫЕ ПРИЛОЖЕНИЯ, откройте вкладку Информация и разверните раздел Типы URL.
    2. Нажмите кнопку + и добавьте зашифрованный идентификатор приложения в качестве схемы URL. Оставьте другие поля пустыми.

      Закодированный идентификатор приложения можно найти в консоли Firebase. Для этого перейдите на вкладку Настройки > Общие и прокрутите страницу вниз до раздела Ваши приложения, чтобы посмотреть сведения о приложении для iOS.

      После этого конфигурация должна выглядеть примерно так (но с вашими значениями):

      Скриншот интерфейса настройки специальной схемы URL в Xcode
  2. Создайте экземпляр OAuthProvider, используя идентификатор поставщика microsoft.com.

    Swift

        var provider = OAuthProvider(providerID: "microsoft.com")
        

    Objective-C

        FIROAuthProvider *provider = [FIROAuthProvider providerWithProviderID:@"microsoft.com"];
        
  3. Необязательно. Укажите дополнительные специальные параметры OAuth, которые вы хотите отправить с запросом OAuth.

    Swift

        provider.customParameters = [
          "prompt": "consent",
          "login_hint": "user@firstadd.onmicrosoft.com"
        ]
        

    Objective-C

        [provider setCustomParameters:@{@"prompt": @"consent", @"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 в объекте специальных параметров.

    Swift

        provider.customParameters = [
          // 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"
        ]
        

    Objective-C

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

    Swift

        provider.scopes = ["mail.read", "calendars.read"]
        

    Objective-C

        [provider setScopes:@[@"mail.read", @"calendars.read"]];
        

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

  5. Необязательно. Если вы хотите настроить способ, которым приложение показывает SFSafariViewController или UIWebView при отображении reCAPTCHA пользователю, создайте специальный класс, соответствующий протоколу AuthUIDelegate, и передайте его в credentialWithUIDelegate.

  6. Выполните аутентификацию в Firebase, используя объект поставщика OAuth.

    Swift

        // Replace nil with the custom class that conforms to AuthUIDelegate
        // you created in last step to use a customized web view.
        provider.getCredentialWith(nil) { credential, error in
          if error != nil {
            // Handle error.
          }
          if credential != nil {
            Auth().signIn(with: credential) { authResult, error in
              if error != nil {
                // Handle error.
              }
              // User is signed in.
              // IdP data available in authResult.additionalUserInfo.profile.
              // OAuth access token can also be retrieved:
              // (authResult.credential as? OAuthCredential)?.accessToken
              // OAuth ID token can also be retrieved:
              // (authResult.credential as? OAuthCredential)?.idToken
            }
          }
        }
        

    Objective-C

        [provider getCredentialWithUIDelegate:nil
                                   completion:^(FIRAuthCredential *_Nullable credential, NSError *_Nullable error) {
          if (error) {
           // Handle error.
          }
          if (credential) {
            [[FIRAuth auth] signInWithCredential:credential
                                      completion:^(FIRAuthDataResult *_Nullable authResult, NSError *_Nullable error) {
              if (error) {
                // Handle error.
              }
              // User is signed in.
              // IdP data available in authResult.additionalUserInfo.profile.
              // OAuth access token can also be retrieved:
              // ((FIROAuthCredential *)authResult.credential).accessToken
              // OAuth ID token can also be retrieved:
              // ((FIROAuthCredential *)authResult.credential).idToken
            }];
          }
        }];
        

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

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

    https://graph.microsoft.com/v1.0/me

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

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

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

    Swift

        Auth().currentUser.link(withCredential: credential) { authResult, error in
          if error != nil {
            // Handle error.
          }
          // Microsoft credential is linked to the current user.
          // IdP data available in authResult.additionalUserInfo.profile.
          // OAuth access token can also be retrieved:
          // (authResult.credential as? OAuthCredential)?.accessToken
          // OAuth ID token can also be retrieved:
          // (authResult.credential as? OAuthCredential)?.idToken
        }
        

    Objective-C

        [[FIRAuth auth].currentUser
            linkWithCredential:credential
                    completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
          if (error) {
            // Handle error.
          }
          // Microsoft credential is linked to the current user.
          // IdP data available in authResult.additionalUserInfo.profile.
          // OAuth access token can also be retrieved:
          // ((FIROAuthCredential *)authResult.credential).accessToken
          // OAuth ID token can also be retrieved:
          // ((FIROAuthCredential *)authResult.credential).idToken
        }];
        
  8. Аналогичный шаблон можно использовать с reauthenticateWithCredential, чтобы получать новые учетные данные для конфиденциальных операций, требующих недавнего входа в систему.

    Swift

        Auth().currentUser.reauthenticateWithCredential(withCredential: credential) { authResult, error in
          if error != nil {
            // Handle error.
          }
          // 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.
          // Additional OAuth access token can also be retrieved:
          // (authResult.credential as? OAuthCredential)?.accessToken
          // OAuth ID token can also be retrieved:
          // (authResult.credential as? OAuthCredential)?.idToken
        }
        

    Objective-C

        [[FIRAuth auth].currentUser
            reauthenticateWithCredential:credential
                              completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
          if (error) {
            // Handle error.
          }
          // 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.
          // Additional OAuth access token can also be retrieved:
          // ((FIROAuthCredential *)authResult.credential).accessToken
          // OAuth ID token can also be retrieved:
          // ((FIROAuthCredential *)authResult.credential).idToken
        }];
        

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

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

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

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

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

Swift

let firebaseAuth = Auth.auth()
do {
  try firebaseAuth.signOut()
} catch let signOutError as NSError {
  print("Error signing out: %@", signOutError)
}

Objective-C

NSError *signOutError;
BOOL status = [[FIRAuth auth] signOut:&signOutError];
if (!status) {
  NSLog(@"Error signing out: %@", signOutError);
  return;
}

Также рекомендуем добавить код обработки ошибок для всех возможных ошибок аутентификации. Подробнее об обработке ошибок…