Personalize navegadores e WebViews para iOS/macOS

Um navegador da Web é necessário para autenticação interativa. No iOS e macOS 10.15+, a Biblioteca de Autenticação da Microsoft (MSAL) utiliza o navegador web do sistema por defeito (que pode aparecer no topo da sua aplicação) para realizar autenticação interativa para os utilizadores que iniciam sessão. A utilização do navegador do sistema tem a vantagem de partilhar o estado de single logon (SSO) com outras aplicações e com aplicações web.

Pode alterar a experiência personalizando a configuração para outras opções de exibição de conteúdos web, tais como:

Apenas para iOS:

Para iOS e macOS:

O MSAL para macOS só suporta WKWebView em versões mais antigas do sistema operativo. ASWebAuthenticationSession é suportado apenas no macOS 10.15 e versões superiores.

Navegadores do sistema

Para iOS, ASWebAuthenticationSession, SFAuthenticationSession, e SFSafariViewController são considerados navegadores de sistema. Para macOS, apenas ASWebAuthenticationSession está disponível. Em geral, os navegadores do sistema partilham cookies e outros dados do site com a aplicação do navegador Safari.

Por defeito, o MSAL deteta dinamicamente a versão do iOS e seleciona o navegador de sistema recomendado disponível nessa versão. No iOS 12 ou superior, será ASWebAuthenticationSession.

Configuração padrão para iOS

Versão browser
iOS 12+ ASWebAuthenticationSession
iOS 11 SFAuthenticationSession
iOS 10 SFSafariViewController

Configuração padrão para macOS

Versão browser
macOS 10.15+ ASWebAuthenticationSession
Outras versões WKWebView

Os programadores também podem escolher um navegador de sistema diferente para aplicações MSAL:

  • SFAuthenticationSession é a versão iOS 11 de ASWebAuthenticationSession.
  • SFSafariViewController é de uso mais geral e fornece uma interface para navegar na web, podendo também ser usado para fins de login. No iOS 9 e 10, cookies e outros dados do site são partilhados com o Safari — mas não no iOS 11 e posteriores.

Navegador dentro da aplicação

O WKWebView é um navegador dentro da aplicação que apresenta conteúdos web. Não partilha cookies nem dados do site com outras instâncias do WKWebView , nem com o navegador Safari. O WKWebView é um navegador multiplataforma disponível tanto para iOS como para macOS.

O navegador que usa afeta a experiência SSO devido à forma como partilham cookies. As tabelas seguintes resumem as experiências SSO por navegador.

Tecnologia Tipo de Navegador Disponibilidade no iOS Disponibilidade no macOS Partilha cookies e outros dados Disponibilidade do MSAL SSO
ASWebAuthenticationSession System iOS12 e superiores macOS 10.15 e superiores Yes iOS e macOS 10.15+ com instâncias do Safari
SFAuthenticationSession System iOS11 e superiores N/A Yes Apenas iOS com instâncias do Safari
SFSafariViewController System iOS11 e superiores N/A No Apenas iOS Não**
SFSafariViewController System iOS10 N/A Yes Apenas iOS com instâncias do Safari
WKWebView Na aplicação iOS8 e superiores macOS 10.10 e superiores No iOS e macOS Não**

** Para que o SSO funcione, os tokens precisam de ser partilhados entre aplicações. Isto requer uma cache de tokens, ou uma aplicação intermediária, como o Microsoft Authenticator para iOS.

Alterar o navegador predefinido para o pedido

Pode usar um navegador dentro da aplicação, ou um navegador de sistema específico dependendo dos seus requisitos de UX, alterando a seguinte propriedade em MSALWebviewParameters:

@property (nonatomic) MSALWebviewType webviewType;

Alteração por pedido interativo

Cada pedido pode ser configurado para substituir o navegador predefinido, alterando a propriedade MSALInteractiveTokenParameters.webviewParameters.webviewType antes de o passar à 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 usar uma webview personalizada, as notificações são usadas para indicar o estado do conteúdo web que está a ser exibido, tais 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 navegadores web suportados por MSAL são declarados no enum 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,
};

Passos seguintes

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