3

tl;博士阅读最后一段。

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

整个流程是成功的,包括检索access_token,但是当我离开应用程序并在 Safari 中打开服务提供商提供的用户个人资料网页时,用户没有登录。我用谷歌帐户测试了相同的流程(https:// accounts.google.com)和 SSO 工作正常,例如,当我在 Safari 中打开https://mail.google.com时,我已登录。所以我怀疑我的服务提供商做错了什么。也许他们没有为我提供正确的范围?但在联系他们之前,我想排除我的任何过错。现在我最直接的想法是会话相关的 cookie 不会以某种方式存储在 Safari 中。我的问题由此而来。

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

4

3 回答 3

3

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

至于您的移动 Safari 体验,ASWebAuthenticationSession的文档,SFAuthenticationSession继承者,状态:

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

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

附带说明一下,即使使用持久性 cookie,在 iOS 11 环境中同步 cookie jar 时似乎也存在一些不一致,例如:http ://www.openradar.me/radar?id=5036182937272320

于 2019-01-24T01:43:05.157 回答
1

要调试 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。

于 2018-12-07T15:46:35.440 回答
0

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

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

于 2020-05-16T10:44:59.190 回答