为啥即使在 WKWebView 中设置 cookie 后 SSO 也不起作用?

Posted

技术标签:

【中文标题】为啥即使在 WKWebView 中设置 cookie 后 SSO 也不起作用?【英文标题】:Why SSO is not working even after setting cookie in WKWebView?为什么即使在 WKWebView 中设置 cookie 后 SSO 也不起作用? 【发布时间】:2018-10-29 06:29:42 【问题描述】:

我有 2 个应用程序,两个应用程序都使用 WKWebview 进行 SSO 登录。两个应用程序单独运行良好。

现在让我们来看看下面的场景。

假设我登录了一个应用程序,从该应用程序检索 WKWebview cookie 并在第二个应用程序的 WKWebview 中设置此 cookie 信息。我的期望是 SSO 应该在第二个应用程序中工作,但它不工作。

以下是我从第一个应用程序登录后用于从 WKwebview 检索 cookie 的代码

扩展 WKWebView

@available(ios 11.0, *)
private var httpCookieStore: WKHTTPCookieStore  
    return WKWebsiteDataStore.default().httpCookieStore


func getCookies(for domain: String? = nil, completion: @escaping ([String : Any])->())  
    var cookieDict = [String : AnyObject]()
    if #available(iOS 11.0, *) 
        httpCookieStore.getAllCookies  (cookies) in
            for cookie in cookies 
                print("cookie iterator started")
                print("cookie=======\(cookie)")

                if let domain = domain 
                    if cookie.domain.contains(domain) 
                        cookieDict[cookie.name] = cookie.properties as AnyObject?
                    
                 else 
                    cookieDict[cookie.name] = cookie.properties as AnyObject?
                
            
            completion(cookieDict)
        
     else 
        // Fallback on earlier versions
    
 

以下是我用于在第二个应用的 WKwebview 中设置 cookie 的代码

 let cookie= HTTPCookie(properties: [
              .domain: "dev.mycompany.net",
              .path: "/",
              .name: "PF",
              .value: "327y48234g2hgdhjwedguyw23oSYVbVLwf9",
              .secure: "TRUE",
             .version: 1,
             .expires: NSDate(timeIntervalSinceNow: (562225018+1000000))
              ])!

HTTPCookieStorage.shared.cookieAcceptPolicy = HTTPCookie.AcceptPolicy.always
HTTPCookieStorage.shared.setCookie(cookie)

【问题讨论】:

这是在 cookie "327y48234g2hgdhjwedguyw23oSYVbVLwf9" 中登录的,对吗?询问您的服务器开发人员,此 cookie 在用户登录后应该是有效的 通过 Safari 开发者门户调试您的 cookie,您的最新 cookie 应该在那里。 【参考方案1】:

我觉得你在第二个应用中做错了 Wkwebview 有自己的 cookie 存储。但是您假设这将在 Wkwebview HTTPCookieStorage.shared.setCookie(cookie) 中设置 cookie。要在第二个应用程序 Wkwebview 中设置 cookie,您应该在 httpcookiestore 中设置您的登录 Cookie Wkwebview

self.webview.configuration.websiteDataStore.httpCookieStore.setCookie("your http cookie here", completionHandler: 

// 在这里做任何你想做的事。现在 cookie 在 wkwebview 中设置

)

使用此方法制作cookie。

let newcookie = HTTPCookie(properties: [
        .domain: "your domain",
        .path: "/",
        .name: "name",
        .value: "value",
        .secure: "FALSE",
        .expires: NSDate(timeIntervalSinceNow: 31556926)
        ])!

【讨论】:

感谢@shauket 的快速回复。是的,我已经试过了,但还是不行 您确定您的新 cookie 已登录 Cookie 吗?我 100% 确定它是否在 cookie 中显示,然后 safari 网络浏览器应该显示并且您的服务器可以识别它。但如果你说 cookie 没有设置,那么你身边就有问题.. 否则它似乎是你的 cookie 无效 仅供参考,您正在检查哪个 ios 版本?此外,您的 cookie 已为此域“dev.mycompany.net”设置,因此您的服务器仅识别此域 我使用的是 WKWebview 而不是 safari 网络浏览器。是的,我在登录后检索 cookie,当然它是有效的,因为 SSO 正在使用此 cookie 信息的第一个应用程序中工作。我正在使用 iOS 版本 11.4 的模拟器中进行检查。当我尝试登录第二个应用程序时,我注意到上面 cookie 信息的一件事正在发生变化。 “PF”:创建= 562489153;丢弃=真;域 = "dev.mycompany.net";姓名 = PF;路径 = "/";安全=真;值 = JYFs8Xsa5L4jG92WV1VGSM;版本 = 1; 那么请咨询您的服务器人员,可能还有其他一些限制也需要登录。 WKHTTPCookieStoreObserver 实现这个观察者可能会有所帮助

以上是关于为啥即使在 WKWebView 中设置 cookie 后 SSO 也不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 7:为啥我的会话 cookie 没有在浏览器中设置?

为啥没有在新标签页控制台中设置 document.cookie?

为啥我不能在我的 Paypal IPN 文件中设置 cookie

即使使用 P3P 标头,也无法在 IE 的 IFRAME 中设置 cookie

为啥 HttpClient 不保存基地址,即使它在 Startup 中设置

如何在 WKWebView 中设置默认缩放