Authentication Services框架详细解析 (六) —— Web Browser App中支持Single Sign-On(一)

版本记录

版本号 时间
V1.0 2021.04.02 星期五

前言

Authentication Services框架为用户提供了授权身份认证Authentication服务,使用户更容易登录App和服务。下面我们就一起来看一下这个框架。感兴趣的看下面几篇文章。
1. Authentication Services框架详细解析 (一) —— 基本概览(一)
2. Authentication Services框架详细解析 (二) —— 使用Sign in with Apple实现用户身份验证(一)
3. Authentication Services框架详细解析 (三) —— 密码的自动填充(一)
4. Authentication Services框架详细解析 (四) —— 使用Account Authentication Modification Extension提升账号安全(一)
5. Authentication Services框架详细解析 (五) —— 使用web authentication session对App中的用户进行身份验证(一)

Overview

首先看下主要内容:

扩展您的Web浏览器应用程序以处理来自其他应用程序的Web身份验证请求。

应用程序可以使用ASWebAuthenticationSession实例通过Web服务对用户进行身份验证。当App调用身份验证会话的start方法时,系统会要求用户的默认网络浏览器在给定的URL上发起身份验证尝试。如果默认浏览器不处理身份验证请求,则系统将使用Safari。无论哪种方式,指定的浏览器都将加载URL,等待用户进行身份验证,然后返回指示尝试结果的回调URL

如果您在macOS上发布Web浏览器应用程序,则可以使其有资格参与此流程。您将浏览器注册为会话处理程序(session handler),然后侦听并处理身份验证请求。


Declare the Session Handling Capability

使用Xcode属性列表编辑器,将ASWebAuthenticationSessionWebBrowserSupportCapabilities键添加到网络浏览器的Information Property List中。对于密钥的值,创建一个包含IsSupported密钥的字典,其对应值为YES

通过声明此功能,可以告诉系统您的Web浏览器应用程序可以处理单点登录(single sign-on)请求。 如果用户已将您的浏览器设置为默认浏览器,则系统会将身份验证请求路由到该浏览器。

可选的是,在EphemeralBrowserSessionIsSupported键上添加一个值,该值指示您的浏览器是否支持临时浏览。

如果您不提供密钥,或者将其值设置为NO,而应用程序尝试进行临时身份验证会话,则系统会警告用户。 如果您通过将值设置为YES来声明支持,请确保遵守任何传入的身份验证请求上的shouldUseEphemeralSession属性,如下面的Perform Authentication中所述。

注意:强烈建议您的网络浏览器支持临时会话。 应用可以专门请求此类会话,因此务必遵守请求。


Listen for Authentication Requests

在Web浏览器应用程序中采用ASWebAuthenticationSessionWebBrowserSessionHandling协议以接收身份验证请求。 选择一个可以充当处理程序的类,并声明对协议的符合性:

class MyAuthenticationHandler: ASWebAuthenticationSessionWebBrowserSessionHandling {
    var request: ASWebAuthenticationSessionRequest?
}

在符合条件的类中,实现协议的beginHandlingWebAuthenticationSessionRequest:方法以接收新的ASWebAuthenticationSessionRequest实例。 使用请求中封装的数据处理请求,如下面的Perform Authentication 中所述。

func begin(_ request: ASWebAuthenticationSessionRequest!) {
    self.request = request   // Store for later.

    if request.shouldUseEphemeralSession == true {
        // Load request.url in an isolated session and wait for the callback.
    } else {
        // Load request.url and wait for the callback.
    }
}

实现cancelWebAuthenticationSessionRequest:方法以侦听取消,如果调用应用终止或取消该操作,则可能会发生取消。 如果您有多个请求在进行中,则可以使用取消请求的UUID属性来标识正在进行的要取消的请求:

func cancel(_ request: ASWebAuthenticationSessionRequest!) {
    // Abandon the request and clean up.
    self.request = nil
}

实施接口之后,通过设置共享会话管理器的sessionHandler属性,告诉系统如何查找会话处理程序。 您通常在启动时执行一次。 例如,您可以在应用程序委托的applicationDidFinishLaunching:方法中设置属性:

func applicationDidFinishLaunching(_ aNotification: Notification) {
    let manager = ASWebAuthenticationSessionWebBrowserSessionManager.shared
    manager.sessionHandler = MyAuthenticationHandler()
    // The manager keeps a strong reference to your handler.
}

Perform Authentication

当您的处理程序收到新的身份验证请求时,请加载请求的URL属性中提供的URL,并将其内容显示给用户。 用户与内容进行交互以进行身份验证,例如,通过输入凭据并单击一个按钮。 执行身份验证的服务通过将浏览器重定向到使用已知callback scheme的URL来指示结果。

请求的callbackURLScheme属性告诉您的浏览器服务使用哪种callback scheme。 当您的浏览器检测到涉及此scheme的重定向时,请通过调用请求的completeWithCallbackURL:方法将整个URL传递回session manager。 例如,在使用WebKit API时,您可以通过导航代理的webView:decidePolicyForNavigationAction:decisionHandler:方法来执行此操作:

func webView(_ webView: WKWebView,
             decidePolicyFor navigationAction: WKNavigationAction,
             decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {

    guard let url = navigationAction.request.url else { return }

    if url.scheme == request?.callbackURLScheme {
        request?.complete(withCallbackURL: url)
    } else {
        // Handle normally.
    }
}

另外,如果浏览器由于某种原因(例如,由于用户已关闭身份验证窗口)而无法完成操作,请改为调用请求的cancelWithError:方法。

如果您声明浏览器支持临时浏览(如上面Declare the Session Handling Capability中所述),请确保遵守请求的shouldUseEphemeralSession属性。 当该值为true时,请避免在身份验证过程中使用任何现有的浏览数据,例如cookie。 另外,请避免在尝试的生命周期之外保留在身份验证尝试期间收集的任何数据,或与其他任何会话共享这些数据。


Handle Launch for Authentication

当您的浏览器支持身份验证流程时,系统可能会专门出于身份验证目的启动浏览器。 您可以通过检查共享session managerwasLaunchedByAuthenticationServices属性来检测这种情况。

func applicationDidFinishLaunching(_ aNotification: Notification) {
    let manager = ASWebAuthenticationSessionWebBrowserSessionManager.shared
    manager.sessionHandler = MyAuthenticationHandler()

    if manager.wasLaunchedByAuthenticationServices == true {
        // Adjust startup behavior accordingly.
    }
}

使用此指示器可以调整浏览器在启动时的行为。 例如,您可能避免恢复以前打开的窗口或选项卡。

后记

本篇主要讲述了Web Browser App中支持Single Sign-On,感兴趣的给个赞或者关注~~~

你可能感兴趣的:(Authentication Services框架详细解析 (六) —— Web Browser App中支持Single Sign-On(一))