ios ASWebAuthenticationSession获取Cookie

tpxzln5u  于 2023-05-19  发布在  iOS
关注(0)|答案(1)|浏览(188)

我正在尝试使用ASWebAuthenticationSession与私有身份提供程序进行身份验证。
1.使用ASWebAuthenticationSession进行身份验证开始
1.调用了自定义方案的回调
1.我需要此请求的所有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?
    }

有人有解决办法吗?

xesrikrc

xesrikrc1#

我遇到了同样的问题,不幸的是没有办法使用ASWebAuthenticationSession获取您的cookie
我的解决方案是使用WKWebView而不是ASWebAuthenticationSession进行身份验证。
这将为您提供实现所需功能的灵活性,主要是因为您可以从WebView访问Cookie。
主要的区别是,你需要手动关闭WebView,为此我想说我们必须选择:
1.将origin or callback url传递给身份验证提供程序后,您将在场景委托中接收它,并从那里到达您要呈现WebView的代码并将其关闭。

func scene(
    _ scene: UIScene, 
    openURLContexts URLContexts: Set<UIOpenURLContext>
) {
    print("SCENE-DELEGATE : Callback received")
    print(URLContexts)
}

1.实现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)
    }

最后,要访问cookie,WKWebView有自己的cookie存储,所以你可能不需要做任何其他事情,应该能够打开一个新的WKWebView,最后一个应该已经有cookie了。
注意:要读取WKWebView中的Cookie,您可以通过以下方式执行:

WKWebsiteDataStore.default().httpCookieStore.getAllCookies { cookies in
          
      }

相关问题