Personalizar navegadores e WebViews para iOS/macOS

É obrigatório o uso de um navegador da Web na autenticação interativa. No iOS e no macOS 10.15+, o Biblioteca do Microsoft Authenticator (MSAL) usa o navegador da Web do sistema por padrão (que pode aparecer na parte superior do seu aplicativo) para fazer autenticação interativa para conectar usuários. O uso do navegador do sistema tem a vantagem de compartilhar o estado de SSO (logon único) com outros aplicativos e com aplicativos Web.

Você pode alterar a experiência personalizando a configuração para outras opções para exibir conteúdo da Web, como:

Somente para iOS:

Para iOS e macOS:

A MSAL para macOS só dá suporte a versões mais antigas WKWebView do sistema operacional. ASWebAuthenticationSession só há suporte no macOS 10.15 e superior.

Navegadores do sistema

Para iOS, ASWebAuthenticationSessione SFAuthenticationSessionSFSafariViewController são considerados navegadores do sistema. Para macOS, só ASWebAuthenticationSession está disponível. Em geral, os navegadores do sistema compartilham cookies e outros dados do site com o aplicativo do navegador Safari.

Por padrão, a MSAL detectará dinamicamente a versão do iOS e selecionará o navegador do sistema recomendado disponível nessa versão. No iOS 12 ou superior, será ASWebAuthenticationSession.

Configuração padrão para iOS

Versão navegador da Web
iOS 12+ ASWebAuthenticationSession
iOS 11 SFAuthenticationSession
iOS 10 SFSafariViewController

Configuração padrão para macOS

Versão navegador da Web
macOS 10.15+ ASWebAuthenticationSession
outras versões WKWebView

Os desenvolvedores também podem selecionar um navegador do sistema diferente para aplicativos MSAL:

  • SFAuthenticationSession é a versão do iOS 11 de ASWebAuthenticationSession.
  • SFSafariViewController é uma finalidade mais geral e fornece uma interface para navegar na Web e também pode ser usada para fins de logon. No iOS 9 e 10, cookies e outros dados do site são compartilhados com o Safari, mas não no iOS 11 e posterior.

Navegador no aplicativo

WKWebView é um navegador no aplicativo que exibe conteúdo da Web. Ele não compartilha cookies ou dados do site com outras instâncias do WKWebView ou com o navegador Safari. WKWebView é um navegador multiplataforma que está disponível para iOS e macOS.

O navegador usado afeta a experiência de SSO devido à forma como eles compartilham cookies. As tabelas a seguir resumem as experiências de SSO por navegador.

Tecnologia Tipo de navegador Disponibilidade do iOS Disponibilidade do macOS Compartilha cookies e outros dados Disponibilidade da MSAL SSO
ASWebAuthenticationSession System iOS12 e para cima macOS 10.15 e para cima Yes iOS e macOS 10.15+ w/ Instâncias do Safari
SFAuthenticationSession System iOS11 e para cima N/A Yes Apenas iOS w/ Instâncias do Safari
SFSafariViewController System iOS11 e para cima N/A No Apenas para iOS Não**
SFSafariViewController System iOS10 N/A Yes Apenas para iOS w/ Instâncias do Safari
WKWebView No aplicativo iOS8 e para cima macOS 10.10 e para cima No iOS e macOS Não**

** Para que o SSO funcione, os tokens precisam ser compartilhados entre aplicativos. Isso requer um cache de token ou um aplicativo de agente, como Microsoft Authenticator para iOS.

Alterar o navegador padrão para a solicitação

Você pode usar um navegador no aplicativo ou um navegador do sistema específico, dependendo dos requisitos de UX, alterando a seguinte propriedade em MSALWebviewParameters:

@property (nonatomic) MSALWebviewType webviewType;

Alteração por solicitação interativa

Cada solicitação pode ser configurada para substituir o navegador padrão alterando a propriedade MSALInteractiveTokenParameters.webviewParameters.webviewType antes de passá-la à API acquireTokenWithParameters:completionBlock:.

Além disso, o MSAL permite passar um WKWebView personalizado definindo a propriedade MSALInteractiveTokenParameters.webviewParameters.customWebView.

Por exemplo:

Objective-C

UIViewController *myParentController = ...;
WKWebView *myCustomWebView = ...;
MSALWebviewParameters *webViewParameters = [[MSALWebviewParameters alloc] initWithAuthPresentationViewController:myParentController];
webViewParameters.webviewType = MSALWebviewTypeWKWebView;
webViewParameters.customWebview = myCustomWebView;
MSALInteractiveTokenParameters *interactiveParameters = [[MSALInteractiveTokenParameters alloc] initWithScopes:@[@"myscope"] webviewParameters:webViewParameters];

[app acquireTokenWithParameters:interactiveParameters completionBlock:completionBlock];

Swift

let myParentController: UIViewController = ...
let myCustomWebView: WKWebView = ...
let webViewParameters = MSALWebviewParameters(authPresentationViewController: myParentController)
webViewParameters.webviewType = MSALWebviewType.wkWebView
webViewParameters.customWebview = myCustomWebView
let interactiveParameters = MSALInteractiveTokenParameters(scopes: ["myscope"], webviewParameters: webViewParameters)

app.acquireToken(with: interactiveParameters, completionBlock: completionBlock)

Se você usar uma visão da Web personalizada, as notificações serão usadas para indicar o status do conteúdo da Web que está sendo exibido, como:

/*! Fired at the start of a resource load in the webview. The URL of the load, if available, will be in the @"url" key in the userInfo dictionary */
extern NSString *MSALWebAuthDidStartLoadNotification;

/*! Fired when a resource finishes loading in the webview. */
extern NSString *MSALWebAuthDidFinishLoadNotification;

/*! Fired when web authentication fails due to reasons originating from the network. Look at the @"error" key in the userInfo dictionary for more details.*/
extern NSString *MSALWebAuthDidFailNotification;

/*! Fired when authentication finishes */
extern NSString *MSALWebAuthDidCompleteNotification;

/*! Fired before ADAL invokes the broker app */
extern NSString *MSALWebAuthWillSwitchToBrokerApp;

Opções

Todos os tipos de navegador da Web compatíveis com MSAL são declarados na enumeração MSALWebviewType

typedef NS_ENUM(NSInteger, MSALWebviewType)
{
    /**
     For iOS 11 and up, uses AuthenticationSession (ASWebAuthenticationSession or SFAuthenticationSession).
     For older versions, with AuthenticationSession not being available, uses SafariViewController.
     For macOS 10.15 and above uses ASWebAuthenticationSession
     For older macOS versions uses WKWebView
     */
    MSALWebviewTypeDefault,

    /** Use ASWebAuthenticationSession where available.
     On older iOS versions uses SFAuthenticationSession
     Doesn't allow any other webview type, so if either of these are not present, fails the request*/
    MSALWebviewTypeAuthenticationSession,

#if TARGET_OS_IPHONE

    /** Use SFSafariViewController for all versions. */
    MSALWebviewTypeSafariViewController,

#endif
    /** Use WKWebView */
    MSALWebviewTypeWKWebView,
};

Próximas Etapas 

Saiba mais sobre fluxos de autenticação e cenários de aplicativo