【问题标题】: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 应该在那里。

标签: ios cookies webview single-sign-on wkwebview


【解决方案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 实现这个观察者可能会有所帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-25
  • 2014-02-25
  • 1970-01-01
  • 1970-01-01
  • 2015-02-27
相关资源
最近更新 更多