带有 ASWebAuthenticationSession 和 SFSafariViewController 的 iOS SSO

问题描述 投票:0回答:2

我们正在制作一个本机应用程序原型,需要:

  • 对用户进行身份验证,以通过 OIDC (OAUTH2) 作为公共客户端获取访问令牌
  • 从我们的网站渲染应用内的 Web 内容,该网站受与从上面获取的访问令牌相同的 IdP (Keycloak) 保护。

我们正在使用 AppAuth 库,它通过使用外部用户代理遵循 RFC 8252 的最佳实践,以便本机应用程序无法窥探用户凭据。 iOS 13+,它使用 ASWebAuthenticationSession。这部分对我们来说非常有效。

我们在尝试通过 SFSafariViewController 访问我们的受保护站点时遇到问题。 IdP 从 ASWebAuthenticationSession 设置的 cookie 不可见。无论 cookie 是会话 cookie 还是持久 cookie,情况都是如此。因此,用户必须再次进行身份验证。

我对各种类型的 cookie 共享状态(持久与会话)与各种版本的 iOS 和各种方法(ASWebAuthenticationSessionSFSafariViewController + WKWebView)感到非常困惑。我似乎找不到明确的矩阵。

从花时间研究来看,感觉 iOS 上目前的 cookie 限制(为了安全+隐私[好东西!]),我无法实现我想要的。这感觉像是一件很常见的事情,我希望我做错了什么。

因此有几个问题:

  1. 同一应用程序中是否允许跨 ASWebAuthenticationSession 和 SFSafariViewController 进行持久和/或会话 cookie 共享?
  2. 如果没有,是否有替代方法/模式?

谢谢!

ios cookies single-sign-on keycloak appauth
2个回答
0
投票

从 iOS 16 开始,据我所知,无法在

ASWebAuthenticationSession
SFSafariViewController
之间共享 cookie。

我为自己的 SSO 实现采取的解决方法是使用

SFSafariViewController
进行初始登录和随后在我的应用程序中进行浏览。

我遇到的这种方法的唯一主要缺点是

SFSafariController
保留的cookie可用于
SFSafariController
,这意味着如果用户打开Safari应用程序,他们将需要重新进行身份验证(而不是
ASWebAuthenticationSession
确实与 Safari 应用程序共享 cookie)。

我真的希望 Apple 能够改进有关 SSO 的文档和实现。


0
投票

有同样的问题。也无法找到在

SFSafariViewController
中打开我们受保护网站的方法。有效的办法是打开一个
ASWebAuthenticationSession

我们使用 SwiftUI,只需使用 BetterSafariView 在 WebAuthenticationSession 中打开我们受保护的站点

.webAuthenticationSession(isPresented: $webAuthenticationSessionIsPresented) {
    WebAuthenticationSession(
        url: <protected_site_url>, 
        callbackURLScheme: nil) { callbackURL, error in 
        // handle callback here
    }
    .prefersEphemeralWebBrowserSession(false)
}
© www.soinside.com 2019 - 2024. All rights reserved.