版本记录
版本号 | 时间 |
---|---|
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 manager
的wasLaunchedByAuthenticationServices
属性来检测这种情况。
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
,感兴趣的给个赞或者关注~~~