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

Ios SFAuthenticationSession如何在Safari中存储与会话相关的cookie,ios,oauth-2.0,openid,appauth,sfauthenticationsession,Ios,Oauth 2.0,Openid,Appauth,Sfauthenticationsession,tl;博士 读最后一段 我正在使用AppAuth()库处理基于OpenID的用户身份验证,我希望通过我的应用程序为这些用户提供SSO体验。我的应用程序的部署目标是iOS 11,这意味着AppAuthence在内部使用SFAuthenticationSession。我使用的是授权流,这意味着用户将通过SFAuthenticationSession获得一个基于web的登录页面。当用户填写并提交凭据时,SFAuthenticationSession使用url调用completion(如果成功),从中可

tl;博士 读最后一段

我正在使用AppAuth()库处理基于OpenID的用户身份验证,我希望通过我的应用程序为这些用户提供SSO体验。我的应用程序的部署目标是iOS 11,这意味着AppAuthence在内部使用
SFAuthenticationSession
。我使用的是授权流,这意味着用户将通过
SFAuthenticationSession
获得一个基于web的登录页面。当用户填写并提交凭据时,
SFAuthenticationSession
使用url调用completion(如果成功),从中可以解析授权
code
。使用授权
code
通过
URLSession
发出的令牌POST请求独立于
SFAuthenticationSession
,并检索
access\u令牌

整个流程都是成功的,包括检索
access\u token
,但当我离开应用程序并在Safari中打开服务提供商提供的用户配置文件网页时,用户未登录。我用一个Google帐户()测试了相同的流,SSO工作得很好,例如,当我在Safari中打开时,我已经登录。所以我怀疑我的服务提供商做错了什么。也许他们没有给我提供正确的瞄准镜?但在联系他们之前,我想排除我的任何过错。现在,我最直接的想法是,与会话相关的cookie不会存储在Safari中。我的问题如下


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

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

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

对于您的移动Safari体验,
SFAuthenticationSession
succession的文档,请说明:

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

SFAuthenticationSession
似乎也是如此。谷歌必须使用持久性cookie,因此会话共享可以与它们协同工作


另一方面,即使使用持久性cookie,在iOS 11环境中同步cookie jar时也会出现一些不一致的情况,例如:

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


检查Cookie是否有过期日期。您可以使用wkwebview查看Cookie。如果没有过期日期,所有苹果操作系统设备将自动将cookie设置为一个会话cookie。如果您让MacBook在Safari中打开url并登录,请关闭Safari。现在打开Safari,再次打开url,看看你是否仍然登录。谢谢你的回答,但这看起来不像我需要的。UIWebView有自己的cookie存储,不与Safari共享cookie。我的问题是关于SSO和使用Safari浏览器共享cookie。我了解您需要什么,这个答案只是为了调试会话的cookie。我已经说过你可以用这个方法检查cookie的有效期。WKWebView是调试会话cookie的唯一方法。Safari、SFAuthenticationSession、SFSafariViewController、ASWebAuthenticationSession不允许调试Cookie。谢谢。谢谢你的回答。