SFAuthenticationSession如何在Safari中存储与会话相关的cookie

时间:2018-12-07 13:40:47

标签: ios oauth-2.0 openid appauth sfauthenticationsession

tl;博士 阅读最后一段。

我正在使用AppAuth(https://github.com/openid/AppAuth-iOS)库来处理基于OpenID的用户身份验证,这些用户想通过我的应用程序提供SSO体验。我的应用程序的部署目标是iOS 11,这意味着AppAuth在内部使用SFAuthenticationSession。我正在使用授权流程,这意味着将通过SFAuthenticationSession向用户显示基于Web的登录页面。当用户填写并提交凭据SFAuthenticationSession时,会使用url(如果成功)调用完成,可以从中解析授权code。得到授权code的支持,通过URLSession发出的令牌POST请求独立于SFAuthenticationSession进行,并且检索access_token

包括检索access_token在内的整个流程都是成功的,但是当我离开该应用程序并在Safari中打开服务提供商提供的用户个人资料网页时,该用户尚未登录。一个Google帐户(https://accounts.google.com)和SSO运作良好,例如当我在Safari中打开https://mail.google.com时,我已登录。因此我怀疑我的服务提供商在做错什么。也许他们没有为我提供正确的范围?但是在联系他们之前,我想排除我的任何毛病。现在,我最直接的想法是,与会话相关的cookie不会以某种方式存储在Safari中。从这个我的问题如下。

我的问题。令牌POST请求是独立于SFAuthenticationSession(不同的用户代理)发出的,因此,如果不通过SFAuthenticationSession,与会话相关的cookie如何存储在设备(Safari)上?有什么方法可以调试代码中的cookie存储吗?

3 个答案:

答案 0 :(得分:1)

要调试Cookie,您可以使用以下代码

导入UIKit

导入WebKit

ViewController类:UIViewController,WKNavigationDelegate {

var webView: WKWebView?

override func viewDidLoad() {
    super.viewDidLoad()

    let configuration = WKWebViewConfiguration()
    webView = WKWebView(frame: .zero,configuration:configuration)
    self.view = webView
}

override func viewDidAppear(_ animated: Bool) {
    let url = URL(string: "YOUR URL")

    let request = URLRequest(url: url!)

    webView?.navigationDelegate = self
    webView?.addObserver(self, forKeyPath: "URL", options: [.new, .old], context: nil)

    self.webView?.load(request)
}

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {

    if let newValue = change?[.newKey] as? Int, let oldValue = change?[.oldKey] as? Int, newValue != oldValue {

        print("NEW",change?[.newKey])
    } else {
        print("OLD",change?[.oldKey])

    }

    webView?.configuration.websiteDataStore.httpCookieStore.getAllCookies { cookies in
        for cookie in cookies {
            print(cookie)
        }
    }
}

}

然后检查cookie是否具有expiresDate属性。如果没有,您将无法使用SSO。

答案 1 :(得分:1)

根据OAuth 2.0标准,token endpoint不需要资源所有者身份验证,与authorization endpoint相反。 (执行授权代码交换的脚本或反向通道不一定访问用户代理中设置的HTTP cookie,并且默认情况下,浏览器在跨站点XHR中不包括凭据。使用刷新令牌时,资源所有者完全不需要交互。)您的URLSession不会从Safari或SFAuthenticationSession获取任何会话cookie,因此也不需要一个。

关于您的移动Safari体验,ASWebAuthenticationSessionSFAuthenticationSession后继者)的文档应注明:

  

除会话cookie外,所有cookie均可与Safari共享。

SFAuthenticationSession似乎也是如此。 Google必须使用持久性cookie,因此会话共享可以使用它们。

另一方面,即使存在持久性Cookie,在iOS 11环境中同步Cookie罐时似乎也存在一些不一致之处,例如:http://www.openradar.me/radar?id=5036182937272320

答案 2 :(得分:0)

如果您不想在浏览器中存储cookie,则可以通过将ASWebAuthenticationSession设置为true的prefersEphemeralWebBrowserSession通过私有浏览会话进行身份验证。

https://github.com/openid/AppAuth-iOS/issues/530#issuecomment-628159766