我们正在制作一个本机应用程序原型,需要:
我们正在使用 AppAuth 库,它通过使用外部用户代理遵循 RFC 8252 的最佳实践,以便本机应用程序无法窥探用户凭据。 iOS 13+,它使用 ASWebAuthenticationSession。这部分对我们来说非常有效。
我们在尝试通过 SFSafariViewController 访问我们的受保护站点时遇到问题。 IdP 从 ASWebAuthenticationSession 设置的 cookie 不可见。无论 cookie 是会话 cookie 还是持久 cookie,情况都是如此。因此,用户必须再次进行身份验证。
我对各种类型的 cookie 共享状态(持久与会话)与各种版本的 iOS 和各种方法(ASWebAuthenticationSession、SFSafariViewController + WKWebView)感到非常困惑。我似乎找不到明确的矩阵。
从花时间研究来看,感觉 iOS 上目前的 cookie 限制(为了安全+隐私[好东西!]),我无法实现我想要的。这感觉像是一件很常见的事情,我希望我做错了什么。
因此有几个问题:
谢谢!
从 iOS 16 开始,据我所知,无法在
ASWebAuthenticationSession
和 SFSafariViewController
之间共享 cookie。
我为自己的 SSO 实现采取的解决方法是使用
SFSafariViewController
进行初始登录和随后在我的应用程序中进行浏览。
我遇到的这种方法的唯一主要缺点是
SFSafariController
保留的cookie仅可用于SFSafariController
,这意味着如果用户打开Safari应用程序,他们将需要重新进行身份验证(而不是) ASWebAuthenticationSession
确实与 Safari 应用程序共享 cookie)。
我真的希望 Apple 能够改进有关 SSO 的文档和实现。
有同样的问题。也无法找到在
SFSafariViewController
中打开我们受保护网站的方法。有效的办法是打开一个ASWebAuthenticationSession
。
我们使用 SwiftUI,只需使用 BetterSafariView 在 WebAuthenticationSession 中打开我们受保护的站点
.webAuthenticationSession(isPresented: $webAuthenticationSessionIsPresented) {
WebAuthenticationSession(
url: <protected_site_url>,
callbackURLScheme: nil) { callbackURL, error in
// handle callback here
}
.prefersEphemeralWebBrowserSession(false)
}