我尝试使用ASWebAuthenticationSession与私有身份提供者进行身份验证。
- 使用ASWebAuthenticationSession开始认证
- 自定义方案的回调被调用
- 我需要这些请求的所有cookie来验证我的WKWebView中的用户。回调只发送给我自定义方案的url,而不是请求。
我无法传输自定义方案url中的cookie,因为我达到了url的最大长度
ASWebAuthenticationSession不使用HTTPCookieStorage来存储cookie,而认证?!
session = ASWebAuthenticationSession(url: urlToCall, callbackURLScheme: scheme)
{ callbackURL, error in
let cookie = callbackURL?.absoluteString.split(separator: "=")[1]
print("Session is (cookie)")
//How to get Cookies here?
}
谁有解决方案?
我遇到了同样的问题,不幸的是,没有办法使用ASWebAuthenticationSession
获得您的cookie我的解决方案是使用WKWebView
而不是ASWebAuthenticationSession
进行身份验证。
这将为您提供实现所需的灵活性,主要是因为您将能够从WebView
访问cookie。
主要的区别是,你将需要手动解散WebView,为此,我想说我们必须选择:
- 一旦你将
origin or callback url
传递给你的验证提供者,你将在你的场景委托中接收它,并从那里到达你呈现WebView的代码并取消它。
func scene(
_ scene: UIScene,
openURLContexts URLContexts: Set<UIOpenURLContext>
) {
print("SCENE-DELEGATE : Callback received")
print(URLContexts)
}
- 实现
WKNavigationDelegate
,并检查重定向URL,直到它匹配您的认证过程中的最终重定向,并从那里取消web视图,这可以在 中完成:
func webView(
_ webView: WKWebView,
decidePolicyFor navigationAction: WKNavigationAction,
decisionHandler: @escaping (WKNavigationActionPolicy) -> Void
) {
if navigationAction.request.url?.host == "ssoResult" {
UIApplication.shared.open(navigationAction.request.url!)
<dismissYourWebView>
decisionHandler(.cancel)
return
}
decisionHandler(.allow)
}
最后访问cookieWKWebView
有它自己的cookie存储,所以你可能不需要做任何其他事情,应该能够打开一个新的WKWebView
,最后一个应该已经有cookie了。
注意:要在您的WKWebView中读取cookie,您可以通过:
WKWebsiteDataStore.default().httpCookieStore.getAllCookies { cookies in
}