Autenticar usando Microsoft y C++

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. Dado que este flujo requiere el uso de los SDK de Firebase basados ​​en teléfonos, solo es compatible con las plataformas Android y Apple.

Antes de que empieces

  1. Agrega Firebase a tu proyecto de C++ .
  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 .

Acceda a la clase firebase::auth::Auth

La clase Auth es la puerta de entrada para todas las llamadas API.
  1. Agregue los archivos de encabezado de autenticación y aplicación:
    #include "firebase/app.h"
    #include "firebase/auth.h"
    
  2. En su código de inicialización, cree una clase firebase::App .
    #if defined(__ANDROID__)
      firebase::App* app =
          firebase::App::Create(firebase::AppOptions(), my_jni_env, my_activity);
    #else
      firebase::App* app = firebase::App::Create(firebase::AppOptions());
    #endif  // defined(__ANDROID__)
    
  3. Adquiera la clase firebase::auth::Auth para su firebase::App . Existe una asignación uno a uno entre App y Auth .
    firebase::auth::Auth* auth = firebase::auth::Auth::GetAuth(app);
    

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 Firebase, sigue estos pasos:

  1. Construya una instancia de FederatedOAuthProviderData configurada con la identificación del proveedor adecuada para Microsoft.

    firebase::auth::FederatedOAuthProviderData
        provider_data(firebase::auth::MicrosoftAuthProvider::kProviderId);
    
  2. Opcional : especifique parámetros OAuth personalizados adicionales que desee enviar con la solicitud OAuth.

    // Prompt user to re-authenticate to Microsoft.
    provider_data.custom_parameters["prompt"] = "login";
    
    // Target specific email with login hint.
    provider_data.custom_parameters["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.

    // 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_data.custom_parameters["tenant"] ="TENANT_ID";
    
  3. Opcional : especifique alcances de OAuth 2.0 adicionales más allá del perfil básico que desea solicitar al proveedor de autenticación.

    provider_data.scopes.push_back("mail.read");
    provider_data.scopes.push_back("calendars.read");
    

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

  4. Una vez que se hayan configurado los datos de su proveedor, utilícelos para crear un FederatedOAuthProvider .

    // Construct a FederatedOAuthProvider for use in Auth methods.
    firebase::auth::FederatedOAuthProvider provider(provider_data);
    
  5. Autentíquese con Firebase utilizando el objeto del proveedor de autenticación. Tenga en cuenta que, a diferencia de otras operaciones de FirebaseAuth, esto tomará el control de su interfaz de usuario al mostrar una vista web en la que el usuario puede ingresar sus credenciales.

    Para iniciar el flujo de inicio de sesión, llame a SignInWithProvider :

    firebase::Future<firebase::auth::AuthResult> result =
      auth->SignInWithProvider(provider_data);
    

    Su aplicación podrá entonces esperar o registrar una devolución de llamada en el Futuro .

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

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

  6. 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 Azure Active Directory a un usuario existente mediante LinkWithProvider . Por ejemplo, puede vincular varios proveedores al mismo usuario, permitiéndoles iniciar sesión con cualquiera de ellos.

    firebase::Future<firebase::auth::AuthResult> result = user.LinkWithProvider(provider_data);
    
  7. Se puede usar el mismo patrón con ReauthenticateWithProvider , que se puede usar para recuperar credenciales nuevas para operaciones confidenciales que requieren un inicio de sesión reciente.

    firebase::Future<firebase::auth::AuthResult> result =
      user.ReauthenticateWithProvider(provider_data);
    

    Su aplicación podrá entonces esperar o registrar una devolución de llamada en el Futuro .

Próximos pasos

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 firebase::auth::User objeto:

    firebase::auth::User user = auth->current_user();
    if (user.is_valid()) {
      std::string name = user.display_name();
      std::string email = user.email();
      std::string photo_url = user.photo_url();
      // The user's ID, unique to the Firebase project.
      // Do NOT use this value to authenticate with your backend server,
      // if you have one. Use firebase::auth::User::Token() instead.
      std::string uid = user.uid();
    }
    
  • 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 a SignOut() :

auth->SignOut();