Compartir a través de


Habilitación de la autenticación en su propia aplicación swift de iOS mediante Azure AD B2C

Importante

A partir del 1 de mayo de 2025, Azure AD B2C ya no estará disponible para la compra por parte de nuevos clientes. Obtenga más información en nuestras preguntas más frecuentes.

En este artículo se muestra cómo agregar la autenticación de Azure Active Directory B2C (Azure AD B2C) a su propia aplicación móvil de iOS Swift. Obtenga información sobre cómo integrar una aplicación swift de iOS con la Biblioteca de autenticación de Microsoft (MSAL) para iOS.

Utilice este artículo con Configurar la autenticación en una aplicación de Swift para iOS, sustituyendo la aplicación de ejemplo de iOS Swift por su propia aplicación de iOS Swift. Una vez que haya completado las instrucciones de este artículo, la aplicación aceptará inicios de sesión a través de Azure AD B2C.

Prerrequisitos

Revise los requisitos previos e instrucciones de integración en Configuración de la autenticación en una aplicación de iOS Swift de ejemplo mediante Azure AD B2C.

Creación de un proyecto de aplicación swift de iOS

Si aún no tiene una aplicación swift de iOS, configure un nuevo proyecto siguiendo estos pasos:

  1. Abra Xcode y, a continuación, seleccione Archivo>nuevo>proyecto.
  2. En aplicaciones de iOS, seleccioneAplicación> y, a continuación, seleccione Siguiente.
  3. En Choose options for your new project (Elegir opciones para el nuevo proyecto), proporcione lo siguiente:
    1. Nombre del producto, como MSALiOS.
    2. Identificador de la organización, como contoso.com.
    3. En Interfaz, seleccione Guión gráfico.
    4. En Ciclo de vida, seleccione Delegado de aplicación UIKit.
    5. En Idioma, seleccione Swift.
  4. Seleccione Siguiente.
  5. Seleccione una carpeta en la que crear la aplicación y, a continuación, seleccione Crear.

Paso 1: Instalación de la biblioteca MSAL

  1. Use CocoaPods para instalar la biblioteca MSAL. En la misma carpeta que el archivo .xcodeproj del proyecto, si el archivo podfile no existe, cree un archivo vacío y asígnelo el nombre podfile. Agregue el código siguiente al archivo podfile :

    use_frameworks!
    
    target '<your-target-here>' do
       pod 'MSAL'
    end
    
  2. Reemplace por <your-target-here> el nombre del proyecto (por ejemplo, MSALiOS). Para obtener más información, vea Referencia de sintaxis de podfile.

  3. En una ventana de terminal, vaya a la carpeta que contiene el archivo podfile y, a continuación, ejecute la instalación del pod para instalar la biblioteca MSAL.

  4. Después de ejecutar el pod install comando, se crea un <archivo name.xcworkspace> del proyecto . Para volver a cargar el proyecto en Xcode, cierre Xcode y abra el archivo <tu nombre de proyecto>.xcworkspace.

Paso 2: Establecer el esquema de dirección URL de la aplicación

Cuando los usuarios se autentican, Azure AD B2C envía un código de autorización a la aplicación mediante el URI de redireccionamiento configurado en el registro de aplicaciones de Azure AD B2C.

El formato URI de redirección predeterminado de MSAL es msauth.[Your_Bundle_Id]://auth. Un ejemplo sería msauth.com.microsoft.identitysample.MSALiOS://auth, donde msauth.com.microsoft.identitysample.MSALiOS es el esquema de dirección URL.

En este paso, registre su esquema de URL utilizando la matriz CFBundleURLSchemes. La aplicación escucha en el esquema de dirección URL para la devolución de llamada de Azure AD B2C.

En Xcode, abra el archivo Info.plist como un archivo de código fuente. En la <dict> sección , agregue el siguiente fragmento de código XML:

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>msauth.com.microsoft.identitysample.MSALiOS</string>
        </array>
    </dict>
</array>
<key>LSApplicationQueriesSchemes</key>
<array>
    <string>msauthv2</string>
    <string>msauthv3</string>
</array>

Paso 3: Agregar el código de autenticación

El código de ejemplo se compone de una UIViewController clase . La clase :

  • Define la estructura de una interfaz de usuario.
  • Contiene información sobre el proveedor de identidades de Azure AD B2C. La aplicación usa esta información para establecer una relación de confianza con Azure AD B2C.
  • Contiene el código de autenticación para autenticar a los usuarios, adquirir tokens y validarlos.

Elija un lugar UIViewController donde se autentiquen los usuarios. Fusiona el código de tu UIViewController con el código proporcionado en GitHub.

Paso 4: Configuración de la aplicación Swift de iOS

Después de agregar el código de autenticación, configure la aplicación swift de iOS con la configuración de Azure AD B2C. La configuración del proveedor de identidades de Azure AD B2C se configura en la UIViewController clase elegida en la sección anterior.

Para obtener información sobre cómo configurar tu aplicación Swift para iOS, consulta Configurar la autenticación en una aplicación Swift para iOS de ejemplo mediante Azure AD B2C.

Paso 5: Ejecutar y probar la aplicación móvil

  1. Compile y ejecute el proyecto con un simulador de un dispositivo iOS conectado.
  2. Seleccione Iniciar sesión y, a continuación, regístrese o inicie sesión con su cuenta local o social de Azure AD B2C.
  3. Después de autenticarse correctamente, se ve el nombre para mostrar en la barra de navegación.

Paso 6: Personalizar los bloques de creación de código

En esta sección se describen los bloques de creación de código que habilitan la autenticación para la aplicación swift de iOS. Enumera los métodos de UIViewController y describe cómo personalizar el código.

Paso 6.1: Creación de instancias de una aplicación cliente pública

Las aplicaciones cliente públicas no son de confianza para mantener de forma segura los secretos de aplicación y no tienen secretos de cliente. En viewDidLoad, cree una instancia de MSAL mediante un objeto de aplicación cliente público.

El siguiente fragmento de código swift muestra cómo inicializar MSAL con un MSALPublicClientApplicationConfig objeto de configuración.

El objeto de configuración proporciona información sobre el entorno de Azure AD B2C. Por ejemplo, proporciona el identificador de cliente, el URI de redirección y la autoridad para crear solicitudes de autenticación en Azure AD B2C. Para obtener información sobre el objeto de configuración, consulte Configuración de la aplicación móvil de ejemplo.

do {

    let signinPolicyAuthority = try self.getAuthority(forPolicy: self.kSignupOrSigninPolicy)
    let editProfileAuthority = try self.getAuthority(forPolicy: self.kEditProfilePolicy)
    
    let pcaConfig = MSALPublicClientApplicationConfig(clientId: kClientID, redirectUri: kRedirectUri, authority: signinPolicyAuthority)
    pcaConfig.knownAuthorities = [signinPolicyAuthority, editProfileAuthority]
    
    self.applicationContext = try MSALPublicClientApplication(configuration: pcaConfig)
    self.initWebViewParams()
    
    } catch {
        self.updateLoggingText(text: "Unable to create application \(error)")
    }

El initWebViewParams método configura la experiencia de autenticación interactiva .

El siguiente fragmento de código swift inicializa el webViewParameters miembro de clase con la vista web del sistema. Para obtener más información, consulte Personalizar exploradores y WebViews para iOS/macOS.

func initWebViewParams() {
    self.webViewParameters = MSALWebviewParameters(authPresentationViewController: self)
    self.webViewParameters?.webviewType = .default
}

Paso 6.2: Iniciar una solicitud de autorización interactiva

Una solicitud de autorización interactiva es un flujo en el que se solicita a los usuarios que se registren o inicien sesión mediante la vista web del sistema. Cuando los usuarios seleccionan el botón Iniciar sesión , se llama al authorizationButton método .

El authorizationButton método prepara el MSALInteractiveTokenParameters objeto con datos pertinentes sobre la solicitud de autorización. El acquireToken método usa MSALInteractiveTokenParameters para autenticar a los usuarios a través de la vista web del sistema.

El siguiente fragmento de código muestra cómo iniciar la solicitud de autorización interactiva:

let parameters = MSALInteractiveTokenParameters(scopes: kScopes, webviewParameters: self.webViewParameters!)
parameters.promptType = .selectAccount
parameters.authority = authority

applicationContext.acquireToken(with: parameters) { (result, error) in

// On error code    
guard let result = result else {
    self.updateLoggingText(text: "Could not acquire token: \(error ?? "No error information" as! Error)")
    return
}

// On success code
self.accessToken = result.accessToken
self.updateLoggingText(text: "Access token is \(self.accessToken ?? "Empty")")
}

Una vez que los usuarios finalicen el flujo de autorización, ya sea con éxito o no, el resultado se devuelve al closure del método acquireToken.

El acquireToken método devuelve los result objetos y error . Use esta clausura para:

  • Actualice la interfaz de usuario de la aplicación móvil con información una vez completada la autenticación.
  • Llame a un servicio de API web con un token de acceso.
  • Controle los errores de autenticación (por ejemplo, cuando un usuario cancela el flujo de inicio de sesión).

Paso 6.3: Llamada a una API web

Para llamar a una API web de autorización basada en tokens, la aplicación necesita un token de acceso válido. La aplicación hace lo siguiente:

  1. Adquiere un token de acceso con los permisos necesarios (ámbitos) para el punto de conexión de API web.
  2. Pasa el token de acceso como un token de portador en el encabezado de autorización de la solicitud HTTP mediante este formato:
Authorization: Bearer <access-token>

Cuando los usuarios se autentican interactivamente, la aplicación obtiene un token de acceso en la clausura de acquireToken. Para las llamadas api web posteriores, use el método acquire token silent (acquireTokenSilent), como se describe en esta sección.

El acquireTokenSilent método realiza las siguientes acciones:

  1. Intenta capturar un token de acceso con los ámbitos solicitados de la caché de tokens. Si el token está presente y no ha expirado, se devuelve el token.
  2. Si el token no está presente en la caché de tokens o ha expirado, la biblioteca MSAL intenta usar el token de actualización para adquirir un nuevo token de acceso.
  3. Si el token de actualización no existe o ha expirado, se devuelve una excepción. En este caso, debe pedir al usuario que inicie sesión de forma interactiva.

El siguiente fragmento de código muestra cómo adquirir un token de acceso:

do {

// Get the authority using the sign-in or sign-up user flow
let authority = try self.getAuthority(forPolicy: self.kSignupOrSigninPolicy)

// Get the current account from the application context
guard let thisAccount = try self.getAccountByPolicy(withAccounts: applicationContext.allAccounts(), policy: kSignupOrSigninPolicy) else {
    self.updateLoggingText(text: "There is no account available!")
    return
}

// Configure the acquire token silent parameters
let parameters = MSALSilentTokenParameters(scopes: kScopes, account:thisAccount)
parameters.authority = authority
parameters.loginHint = "username"

// Acquire token silent
self.applicationContext.acquireTokenSilent(with: parameters) { (result, error) in
    if let error = error {
        
        let nsError = error as NSError
        
        // interactionRequired means we need to ask the user to sign in. This usually happens
        // when the user's Refresh Token is expired or if the user has changed their password
        // among other possible reasons.
        
        if (nsError.___domain == MSALErrorDomain) {
            
            if (nsError.code == MSALError.interactionRequired.rawValue) {
                
                // Start an interactive authorization code
                // Notice we supply the account here. This ensures we acquire token for the same account
                // as we originally authenticated.
                
                ...
            }
        }
        
        self.updateLoggingText(text: "Could not acquire token: \(error)")
        return
    }
    
    guard let result = result else {
        
        self.updateLoggingText(text: "Could not acquire token: No result returned")
        return
    }
    
    // On success, set the access token to the accessToken class member. 
    // The callGraphAPI method uses the access token to call a web API  
    self.accessToken = result.accessToken
    ...
}
} catch {
self.updateLoggingText(text: "Unable to construct parameters before calling acquire token \(error)")
}

El callGraphAPI método recupera el token de acceso y llama a la API web, como se muestra aquí:

@objc func callGraphAPI(_ sender: UIButton) {
    guard let accessToken = self.accessToken else {
        self.updateLoggingText(text: "Operation failed because could not find an access token!")
        return
    }
    
    let sessionConfig = URLSessionConfiguration.default
    sessionConfig.timeoutIntervalForRequest = 30
    let url = URL(string: self.kGraphURI)
    var request = URLRequest(url: url!)
    request.setValue("Bearer \(accessToken)", forHTTPHeaderField: "Authorization")
    let urlSession = URLSession(configuration: sessionConfig, delegate: self, delegateQueue: OperationQueue.main)
    
    self.updateLoggingText(text: "Calling the API....")
    
    urlSession.dataTask(with: request) { data, response, error in
        guard let validData = data else {
            self.updateLoggingText(text: "Could not call API: \(error ?? "No error information" as! Error)")
            return
        }
        
        let result = try? JSONSerialization.jsonObject(with: validData, options: [])
        
        guard let validResult = result as? [String: Any] else {
            self.updateLoggingText(text: "Nothing returned from API")
            return
        }
        
        self.updateLoggingText(text: "API response: \(validResult.debugDescription)")
        }.resume()
}

Paso 6.4: Cerrar sesión de usuarios

Al cerrar sesión con MSAL, se quita toda la información conocida sobre los usuarios de la aplicación. Use el método de cierre de sesión para cerrar la sesión de los usuarios y actualizar la interfaz de usuario. Por ejemplo, puede ocultar los elementos protegidos de la interfaz de usuario, ocultar el botón de cierre de sesión o mostrar el botón de inicio de sesión.

En el fragmento de código siguiente se muestra cómo cerrar la sesión de los usuarios:

@objc func signoutButton(_ sender: UIButton) {
do {
    
    
    let thisAccount = try self.getAccountByPolicy(withAccounts: applicationContext.allAccounts(), policy: kSignupOrSigninPolicy)
    
    if let accountToRemove = thisAccount {
        try applicationContext.remove(accountToRemove)
    } else {
        self.updateLoggingText(text: "There is no account to signing out!")
    }
    
    ...
    
} catch  {
    self.updateLoggingText(text: "Received error signing out: \(error)")
}
}

Pasos siguientes

Obtenga información sobre cómo: