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存储吗?
答案 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体验,ASWebAuthenticationSession(SFAuthenticationSession
后继者)的文档应注明:
除会话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