Autenticar usando Microsoft en plataformas Apple

Puede permitir que sus usuarios se autentiquen con Firebase utilizando proveedores de OAuth como Microsoft Azure Active Directory integrando el inicio de sesión OAuth genérico basado en web en su aplicación utilizando el SDK de Firebase para llevar a cabo el flujo de inicio de sesión de un extremo a otro.

Antes de que empieces

Para iniciar sesión de usuarios usando cuentas de Microsoft (Azure Active Directory y cuentas personales de Microsoft), primero debe habilitar Microsoft como proveedor de inicio de sesión para su proyecto de Firebase:

  1. Agrega Firebase a tu proyecto de Apple .
  2. En Firebase console , abre la sección Auth .
  3. En la pestaña Método de inicio de sesión , habilite el proveedor de Microsoft .
  4. Agregue el ID de cliente y el Secreto de cliente desde la consola de desarrollador de ese proveedor a la configuración del proveedor:
    1. Para registrar un cliente Microsoft OAuth, siga las instrucciones de Inicio rápido: Registrar una aplicación con el punto final de Azure Active Directory v2.0 . Tenga en cuenta que este punto final admite el inicio de sesión mediante cuentas personales de Microsoft, así como cuentas de Azure Active Directory. Obtenga más información sobre Azure Active Directory v2.0.
    2. Al registrar aplicaciones con estos proveedores, asegúrese de registrar el dominio *.firebaseapp.com para su proyecto como dominio de redireccionamiento para su aplicación.
  5. Clic en Guardar .

Maneja el flujo de inicio de sesión con el SDK de Firebase

Para manejar el flujo de inicio de sesión con el SDK de las plataformas Firebase Apple, siga estos pasos:

  1. Agregue esquemas de URL personalizados a su proyecto Xcode:

    1. Abra la configuración de su proyecto: haga doble clic en el nombre del proyecto en la vista de árbol de la izquierda. Seleccione su aplicación en la sección OBJETIVOS , luego seleccione la pestaña Información y expanda la sección Tipos de URL .
    2. Haga clic en el botón + y agregue su ID de aplicación codificada como un esquema de URL. Puede encontrar su ID de aplicación codificada en la página Configuración general de Firebase console, en la sección de su aplicación iOS. Deje los demás campos en blanco.

      Cuando esté completa, su configuración debería verse similar a la siguiente (pero con los valores específicos de su aplicación):

      Captura de pantalla de la interfaz de configuración del esquema de URL personalizado de Xcode
  2. Cree una instancia de OAuthProvider utilizando el ID de proveedor microsoft.com .

    Rápido

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

    C objetivo

        FIROAuthProvider *provider = [FIROAuthProvider providerWithProviderID:@"microsoft.com"];
        
  3. Opcional : especifique parámetros OAuth personalizados adicionales que desee enviar con la solicitud OAuth.

    Rápido

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

    C objetivo

        [provider setCustomParameters:@{@"prompt": @"consent", @"login_hint": @"user@firstadd.onmicrosoft.com"}];
        

    Para conocer los parámetros que admite Microsoft, consulte la documentación de Microsoft OAuth . Ten en cuenta que no puedes pasar los parámetros requeridos por Firebase con setCustomParameters . Estos parámetros son client_id , tipo_respuesta , redirección_uri , estado , alcance y modo_respuesta .

    Para permitir que solo los usuarios de un inquilino de Azure AD en particular inicien sesión en la aplicación, se puede usar el nombre de dominio descriptivo del inquilino de Azure AD o el identificador GUID del inquilino. Esto se puede hacer especificando el campo "inquilino" en el objeto de parámetros personalizados.

    Rápido

        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"
        ]
        

    C objetivo

        // 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. Opcional : especifique alcances de OAuth 2.0 adicionales más allá del perfil básico que desea solicitar al proveedor de autenticación.

    Rápido

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

    C objetivo

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

    Para obtener más información, consulte la documentación de permisos y consentimiento de Microsoft .

  5. Opcional : si desea personalizar la forma en que su aplicación presenta SFSafariViewController o UIWebView cuando muestra reCAPTCHA al usuario, cree una clase personalizada que se ajuste al protocolo AuthUIDelegate y pásela a credentialWithUIDelegate .

  6. Autentíquese con Firebase utilizando el objeto proveedor de OAuth.

    Rápido

        // 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
            }
          }
        }
        

    C objetivo

        [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
            }];
          }
        }];
        

    Con el token de acceso de OAuth, puede llamar a la API de Microsoft Graph .

    Por ejemplo, para obtener información básica del perfil, puede llamar a la API REST y pasar el token de acceso en el encabezado Authorization :

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

    A diferencia de otros proveedores compatibles con Firebase Auth, Microsoft no proporciona una URL de foto y, en su lugar, los datos binarios de una foto de perfil deben solicitarse a través de Microsoft Graph API .

    Además del token de acceso de OAuth, el token de ID de OAuth del usuario también se puede recuperar del objeto OAuthCredential . La sub en el token de ID es específica de la aplicación y no coincidirá con el identificador de usuario federado utilizado por Firebase Auth y al que se puede acceder a través de user.providerData[0].uid . En su lugar, se debe utilizar el campo de reclamo oid . Cuando se utiliza un inquilino de Azure AD para iniciar sesión, la notificación oid será una coincidencia exacta. Sin embargo, para el caso de no inquilino, el campo oid se rellena. Para un ID federado 4b2eabcdefghijkl , el oid tendrá el formato 00000000-0000-0000-4b2e-abcdefghijkl .

  7. Si bien los ejemplos anteriores se centran en los flujos de inicio de sesión, también tiene la posibilidad de vincular un proveedor de Microsoft a un usuario existente mediante linkWithCredential . Por ejemplo, puede vincular varios proveedores al mismo usuario, permitiéndoles iniciar sesión con cualquiera de ellos.

    Rápido

        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
        }
        

    C objetivo

        [[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. Se puede usar el mismo patrón con reauthenticateWithCredential , que se puede usar para recuperar credenciales nuevas para operaciones confidenciales que requieren un inicio de sesión reciente.

    Rápido

        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
        }
        

    C objetivo

        [[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
        }];
        

Después de que un usuario inicia sesión por primera vez, se crea una nueva cuenta de usuario y se vincula a las credenciales (es decir, el nombre de usuario y la contraseña, el número de teléfono o la información del proveedor de autenticación) con las que el usuario inició sesión. Esta nueva cuenta se almacena como parte de su proyecto de Firebase y se puede usar para identificar a un usuario en cada aplicación de su proyecto, independientemente de cómo inicie sesión el usuario.

  • En sus aplicaciones, puede obtener la información básica del perfil del usuario desde el objeto User . Consulte Administrar usuarios .

  • En las reglas de seguridad de Firebase Realtime Database y Cloud Storage, puede obtener el ID de usuario único del usuario que inició sesión a partir de la variable auth y usarlo para controlar a qué datos puede acceder un usuario.

Puede permitir que los usuarios inicien sesión en su aplicación utilizando múltiples proveedores de autenticación vinculando las credenciales del proveedor de autenticación a una cuenta de usuario existente.

Para cerrar la sesión de un usuario, llame signOut: .

Rápido

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

C objetivo

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

Es posible que también desee agregar un código de manejo de errores para toda la gama de errores de autenticación. Consulte Manejar errores .