博士读了最后一段。
我正在使用AppAuth (https://github.com/openid/AppAuth-iOS)库来处理基于OpenID的用户身份验证,我希望通过我的应用程序为其提供SSO体验。我的应用程序的部署目标是iOS 11,这意味着AppAuth内部使用SFAuthenticationSession。我使用的是授权流程,这意味着用户通过SFAuthenticationSession向用户展示了一个基于web的登录页面。当用户填写并提交凭据时,SFAuthenticationSession将使用url (如果成功)调用completion,从中可以解析授权code。使用授权code,可以独立于SFAuthenticationSession通过URLSession发出令牌POST请求,并检索access_token。
整个流程是成功的,包括检索access_token,但是当我离开应用程序并打开服务提供商在Safari中提供的用户配置文件网页时,用户不会登录。我在Google (https://accounts.google.com)中测试了相同的流,并且SSO运行良好,例如,当我在Safari中打开https://mail.google.com时,我就登录了。所以我怀疑我的服务商做错了什么。也许他们没有给我提供正确的显微镜?但在联系他们之前,我想排除我的任何过错。现在,我最直接的想法是,会话相关的cookie不知何故不会存储在Safari中。以下是我的问题。
我的问题。令牌POST请求是独立于SFAuthenticationSession (不同的用户代理)发出的,那么,如果不是通过SFAuthenticationSession,那么如何将任何与会话相关的cookie存储在设备(Safari)上呢?是否有任何方法来调试代码中的cookie存储?
发布于 2019-01-24 01:43:05
根据OAuth 2.0标准,令牌端点不需要资源所有者身份验证,这与授权端点相反。(执行授权代码交换的脚本或后台通道不一定能够访问用户代理中设置的HTTP,默认情况下,浏览器不包括跨站点XHR中的凭据。当使用刷新令牌时,根本不需要资源所有者交互。)您的URLSession没有从Safari或SFAuthenticationSession获得任何会话cookie,因此不应该需要会话cookie。
至于您的移动Safari体验,SFAuthenticationSession后继者SFAuthenticationSession的docs声明:
除了会话cookie之外,所有cookie都可以与Safari共享。
SFAuthenticationSession似乎也是如此。Google必须使用持久cookie,因此会话共享与它们一起工作。
另外,即使是持久化cookie,在iOS 11环境中同步cookie jars似乎也有一些不一致之处,例如:http://www.openradar.me/radar?id=5036182937272320
发布于 2018-12-07 15:46:35
要调试cookies,可以使用以下代码:
import UIKit
import WebKit
class 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。
发布于 2020-05-16 10:44:59
如果您不想在浏览器中存储cookie,您可以使用ASWebAuthenticationSession进行私有浏览会话,prefersEphemeralWebBrowserSession设置为true。
https://github.com/openid/AppAuth-iOS/issues/530#issuecomment-628159766
https://stackoverflow.com/questions/53670770
复制相似问题