Настройка браузеров и WebViews для iOS/macOS

Для интерактивной проверки подлинности требуется веб-браузер. В iOS и macOS 10.15+, Microsoft Authentication Library (MSAL) использует системный веб-браузер по умолчанию (который может отображаться в верхней части приложения) для выполнения интерактивной проверки подлинности для входа пользователей. Использование системного браузера имеет преимущество совместного использования состояния единого входа (SSO) с другими приложениями и веб-приложениями.

Вы можете изменить интерфейс, настроив конфигурацию на другие параметры для отображения веб-содержимого, например:

Только для iOS:

Для iOS и macOS:

MSAL для macOS поддерживает WKWebView только в старых версиях ОС. ASWebAuthenticationSession поддерживается только в macOS 10.15 и более поздних версиях.

Системные браузеры

Для iOS, ASWebAuthenticationSessionи SFAuthenticationSessionSFSafariViewController считаются системными браузерами. Для macOS доступен только ASWebAuthenticationSession. Как правило, системные браузеры совместно используют файлы cookie и другие данные веб-сайта с приложением браузера Safari.

По умолчанию MSAL динамически обнаруживает версию iOS и выбирает рекомендуемый системный браузер, доступный в этой версии. В iOS 12+ он будет ASWebAuthenticationSession.

Конфигурация по умолчанию для iOS

Версия веб-браузер;
iOS 12+ ASWebAuthenticationSession
iOS 11 SFAuthenticationSession
iOS 10 SFSafariViewController

Конфигурация по умолчанию для macOS

Версия веб-браузер;
macOS 10.15+ ASWebAuthenticationSession
другие версии WKWebView

Разработчики также могут выбрать другой системный браузер для приложений MSAL:

  • SFAuthenticationSession — это версия ASWebAuthenticationSessioniOS 11 .
  • SFSafariViewController является более общим назначением и предоставляет интерфейс для просмотра в Интернете и может использоваться для целей входа. В iOS 9 и 10 файлы cookie и другие данные веб-сайта используются в Safari, но не в iOS 11 и более поздних версиях.

Браузер в приложении

WKWebView — это браузер в приложении, который отображает веб-содержимое. Он не предоставляет общий доступ к файлам cookie или данным веб-сайта другим экземплярам WKWebView или браузеру Safari. WKWebView — это кроссплатформенный браузер, доступный как для iOS, так и для macOS.

Браузер, который вы используете, влияет на работу SSO из-за особенностей обмена файлами cookie. В следующих таблицах приведена сводка по сценариям единого входа для каждого браузера.

Технология Тип браузера Доступность iOS Доступность macOS Передаёт файлы cookie и другие данные Доступность MSAL Система единого входа (SSO)
ASWebAuthenticationSession Система iOS12 и вверх macOS 10.15 и более Да iOS и macOS 10.15+ Экземпляры с Safari
SFAuthenticationSession Система iOS11 и вверх N/A Да Только iOS Экземпляры с Safari
SFSafariViewController Система iOS11 и вверх N/A Нет Только iOS Нет**
SFSafariViewController Система iOS10 N/A Да Только iOS Экземпляры с Safari
WKWebView В приложении iOS8 и вверх macOS 10.10 и более Нет iOS и macOS Нет**

** Для обеспечения работы единого входа маркеры необходимо совместно использовать между приложениями. Для этого требуется кэш токенов или приложение-посредник, например Microsoft Authenticator для iOS.

Изменение браузера по умолчанию для запроса

Вы можете использовать браузер в приложении или определенный системный браузер в зависимости от требований пользовательского интерфейса, изменив следующее свойство в MSALWebviewParameters:

@property (nonatomic) MSALWebviewType webviewType;

Изменение по интерактивному запросу

Каждый запрос можно настроить так, чтобы переопределить браузер по умолчанию, изменив свойство MSALInteractiveTokenParameters.webviewParameters.webviewType перед передачей запроса в API acquireTokenWithParameters:completionBlock:.

Кроме того, MSAL поддерживает возможность передавать пользовательский WKWebView, задав свойство MSALInteractiveTokenParameters.webviewParameters.customWebView.

Рассмотрим пример.

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)

При использовании пользовательского веб-представления уведомления используются для указания состояния отображаемого веб-содержимого, например:

/*! 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;

Options

Все поддерживаемые типы веб-браузеров MSAL объявляются в перечислении 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,
};

Дальнейшие действия

Дополнительные сведения о потоках проверки подлинности и сценариях приложений