我可以在 SFSafariViewController 中从 Safari 获取 cookie 吗?

Can I get cookies from Safari in a SFSafariViewController?

tl;博士;看下面的问题

在我的应用程序中,我有一个使用遵循 OAuth 2.0 流程(使用 AppAuth 库)的 SFSafariViewController 和 ASWebAuthenticationSession 的登录。

登录有效,并且 cookie 已按预期与 Safari 共享。由于 cookie 共享,如果用户使用 Safari 应用程序,他们将自动登录。

但是,回到应用程序,如果我再次启动 SFSafariViewController,cookie 就会丢失。这让我很吃惊,因为我认为 cookie Store 对于 SFSafariViewController 和 Safari 是一样的,而且它显然在登录期间从 SFSafariVC 到 Safari 应用程序的方向起作用。 它是否打算以相反的方式工作 - 从 Safari 到 SFSafariViewController,还是一个错误?

我没有在文档中找到明确的说明。 当然,我没有将临时会话设置为 true,但根据文档,它会做与我想要实现的相反的事情:

When not using an ephemeral session, all cookies except session cookies are available to the browser.

我也发现了一些相关的雷达,例如 http://www.openradar.me/33323462 and http://www.openradar.me/radar?id=5036182937272320 or this Whosebug post: Why is SFSafariWebViewController not sharing cookies with Safari properly?,但它们没有回答我的问题。

根据 this comment,如果 cookie 有到期日期(设置为未来日期),它可能会起作用。我验证了 cookie - 它们都有未来的到期日。

我的问题:SFSafariViewController 没有从同一应用程序或 Safari 中较早的 SFSafariViewController 实例获取 cookie,是我做错了什么,还是这是预期的行为?

请求UI备注

看来您需要一个解决方案来从移动应用程序调用受保护的 Web 内容,并避免额外登录。这是一个常见的要求,我将在接下来的一个月左右的时间里向 my blog 添加一些关于此主题的内容。

行业状况

上述问题是,由于 Intelligent Tracking Prevention 更改等浏览器安全措施,第三方 cookie(例如由身份提供商发布的 cookie)经常被默认删除 - 默认情况下处于启用状态在 Safari 中:

Cookie 属性

值得检查您的 cookie 是否与 SameSite=None 一起发布,这将为您提供基于第三方 cookie 的解决方案的最佳选择。

移动优先设计

在 OAuth 世界中,为了满足要求,很可能需要从移动设备 UI 向网络 UI 发送令牌,这当然有先决条件需要设计用于:

  • Web UI 必须使用令牌
  • Web UI 必须根据主机使用不同的令牌处理策略

选项 1

一种选择是使用移动网络视图来显示网络内容 - 请参阅下面的代码:

选项 2

另一种选择是将表示查询字符串参数中令牌的内容从移动应用程序发送到 Web UI,在这种情况下,您需要确保:

  • 网络服务器日志中没有记录可用的令牌
  • 令牌只能使用一次

典型的实现如下所示:

  • 移动 UI 调用 /api/token/encrypt 端点
  • API 在数据库中存储一个令牌散列,returns 一个生存时间短的加密值
  • 令牌从移动应用程序发送到 Web UI
  • Web UI 调用一个 /api/token/decrypt 端点来获取真正的令牌
  • API 的解密实现删除了数据库条目