oauth-2.0 SFAuthenticationSession如何在Safari中存储与会话相关的Cookie

cdmah0mi  于 2022-10-31  发布在  其他
关注(0)|答案(3)|浏览(194)

读最后一段。
我正在使用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存储?

cpjpxq1n

cpjpxq1n1#

根据OAuth 2.0标准,令牌端点不需要资源所有者身份验证,这与授权端点需要资源所有者身份验证相反。(执行授权代码交换的脚本或反向通道不一定能够访问用户代理中设置的HTTPcookie,默认情况下,浏览器在跨站点XHR中不包括凭据。使用刷新令牌时,根本不需要资源所有者交互。)您的URLSession不会从Safari或SFAuthenticationSession获取任何会话cookie,因此应该不需要。
关于您的移动的Safari体验,SFAuthenticationSession的继任者ASWebAuthenticationSession的文档中指出:
除会话Cookie外,所有Cookie都可以与Safari共享。
SFAuthenticationSession似乎也是如此。Google一定使用了持久性cookie,因此会话共享可以与它们一起工作。
顺便说一句,即使使用持久性Cookie,在iOS 11环境中同步Cookie jar时也会出现一些不一致,例如:http://www.openradar.me/radar?id=5036182937272320

ckx4rj1h

ckx4rj1h2#

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

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。

00jrzges

00jrzges3#

如果您不想在浏览器中存储cookie,您可以通过ASWebAuthenticationSession的私人浏览会话进行身份验证,并将prefersEphemeralWebBrowserSession设置为true。
https://github.com/openid/AppAuth-iOS/issues/530#issuecomment-628159766

相关问题