Tutorial: Compatibilidad con reserva web
Se aplica a: iOS (Swift) macOS (Swift)
En este tutorial se muestra cómo adquirir un token a través de un explorador donde la autenticación nativa no es suficiente para completar el flujo de usuario.
En este tutorial, aprenderá a:
- Comprobar el error BrowserRequired.
- Controlar el error BrowserRequired.
Requisitos previos
- Si usas iOS, sigue los pasos de Inicio de sesión de usuarios en una aplicación móvil iOS nativa de ejemplo.
- Si usas macOS, sigue los pasos de Inicio de sesión de usuarios en la aplicación macOS (Swift) de ejemplo mediante la autenticación nativa.
Se requiere el explorador
BrowserRequired
es un mecanismo de reserva para varios escenarios en los que la autenticación nativa no es suficiente para completar el flujo de usuario.
Para garantizar la estabilidad de la aplicación y evitar la interrupción del flujo de autenticación, se recomienda encarecidamente usar el método acquireToken()
del SDK para continuar el flujo en el explorador.
Al inicializar el SDK, es necesario especificar qué tipos de desafío puede admitir nuestra aplicación. Esta es la lista de tipos de desafío que acepta el SDK:
- OOB (fuera de banda): agrega este tipo de desafío cuando la aplicación de iOS/macOS pueda controlar un código de acceso de un solo uso, en este caso un código por correo electrónico.
- Contraseña: agregue este tipo de desafío cuando la aplicación pueda controlar la autenticación basada en contraseñas.
Cuando Microsoft Entra requiere funcionalidades que el cliente no puede proporcionar se devolverá el error BrowserRequired
. Por ejemplo, supongamos que inicializamos la instancia del SDK especificando solo el tipo de desafío OOB, pero en el Centro de administración de Microsoft Entra, la aplicación está configurada con un flujo de usuario de Correo electrónico con contraseña. Cuando llamamos al método signUp(username) desde la instancia del SDK, obtenemos un error BrowserRequired
, porque Microsoft Entra requiere un tipo de desafío (contraseña en este caso) diferente al configurado en el SDK.
El tipo de desafío insuficiente es solo un ejemplo de cuándo se puede producir BrowserRequired
. BrowserRequired
es un mecanismo de reserva general que puede ocurrir en varios escenarios.
Flujo de muestra
En el siguiente fragmento de código, puede ver cómo puede especificar los tipos de desafío durante la inicialización de la instancia del SDK:
nativeAuth = try MSALNativeAuthPublicClientApplication(
clientId: "<client id>",
tenantSubdomain: "<tenant subdomain>",
challengeTypes: [.OOB]
)
En este caso, solo se especifica el tipo de desafío OOB. Supongamos que en el Centro de administración de Microsoft Entra, la aplicación está configurada con un flujo de usuario de Correo electrónico con contraseña.
nativeAuth.signUp(username: email, delegate: self)
func onSignUpStartError(error: MSAL.SignUpStartError) {
if error.isBrowserRequired {
// handle browser required error
}
}
Cuando llamamos al método signUp(username:delegate)
desde la instancia del SDK, obtenemos un error BrowserRequired
, porque Microsoft Entra requiere un tipo de desafío (contraseña en este caso) diferente al configurado en el SDK.
Control del error BrowserRequired
Para controlar este tipo de error, es necesario iniciar un explorador y permitir que el usuario realice el flujo de autenticación allí. Esto se puede hacer llamando al método acquireToken()
. Para usar este método, es necesario realizar algunas configuraciones adicionales:
- Configuración de esquemas de URL en nuestro proyecto de Xcode
- Configuración del URI de redirección en el Centro de administración de Microsoft Entra
Ahora podemos obtener un token y una cuenta de forma interactiva. Aquí se muestra un ejemplo de cómo se hace:
func onSignUpStartError(error: MSAL.SignUpStartError) {
if error.isBrowserRequired {
let webviewParams = MSALWebviewParameters(authPresentationViewController: self)
let parameters = MSALInteractiveTokenParameters(scopes: ["User.Read"], webviewParameters: webviewParams)
nativeAuth.acquireToken(with: parameters) { (result: MSALResult?, error: Error?) in
// result will contain account and tokens retrieved in the browser
}
}
}
Los tokens y la cuenta que se devuelven son idénticos a los que se recuperarían a través de un flujo de autenticación nativo.