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

Posted

技术标签:

【中文标题】我可以在 SFSafariViewController 中从 Safari 获取 cookie 吗?【英文标题】:Can I get cookies from Safari in a SFSafariViewController? 【发布时间】:2020-07-20 14:23:20 【问题描述】:

tl;博士;看下面的问题

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

登录正常,cookie 按预期与 Safari 共享。由于 cookie 共享,用户在使用 Safari 应用程序时会自动登录。

但是,回到应用程序中,如果我再次启动 SFSafariViewController,cookie 就会丢失。这让我很吃惊,因为我认为 SFSafariViewController 和 Safari 的 cookie Store 是相同的,并且在登录期间它显然是在从 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 和 http://www.openradar.me/radar?id=5036182937272320 或这个 *** 帖子:Why is SFSafariWebViewController not sharing cookies with Safari properly?,但它们没有回答我的问题。

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

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

【问题讨论】:

【参考方案1】:

要求

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

行业现状

上述问题在于,由于浏览器安全措施(例如 Intelligent Tracking Prevention 更改),第三方 cookie(例如由身份提供者发布的那些)通常默认被丢弃 - 在 Safari 中默认情况下是开启的:

Cookie 属性

值得检查您的 cookie 是使用 SameSite=None 发出的,这将为您提供基于第三方 cookie 的解决方案的最佳选择。

移动优先设计

在 OAuth 世界中,为了满足要求,很可能需要将令牌从移动 UI 发送到 Web UI,这当然有需要设计的先决条件:

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

选项 1

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

Web UI Code to ask the host for tokens Mobile UI Code to service these requests

选项 2

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

Web 服务器日志中未记录任何可用令牌 令牌只能使用一次

典型的实现如下所示:

移动 UI 调用 /api/token/encrypt 端点 API 将令牌哈希存储在数据库中,并返回一个存活时间较短的加密值 令牌从移动应用程序发送到 Web UI Web UI 调用 /api/token/decrypt 端点来获取真正的令牌 API 的解密实现会删除数据库条目

【讨论】:

嗨@gary-archer,感谢您的回复-非常感谢。你的博文也很不错。鉴于我得到的所有信息,我的印象是 ios12 以上的设计是不可能的。据我了解,ASWebAuthenticationSession 仅用于登录流程,如果我已经登录,之后我将无法使用它。我唯一的选择是打开 Safari(有效)或 SFSafariViewController(不由于缺少 cookie,不符合我的需求)。当然,我可以使用访问令牌向我的安全后端 API 发出请求,但对于 SFSafariVC,我需要 cookie。 那么您有 2 个应用程序吗?一个网络应用程序和一个移动应用程序?您正在尝试从移动应用调用安全的网络视图? 我有一个原生 iOS 应用和一个网络应用。对于某个功能,iOS 应用程序必须使用部分网络应用程序。最好在 SFSafariViewController 中,以便将用户(视觉上)保持在 iOS 应用程序中。所以,是的,我尝试从移动应用程序调用安全的 Web 视图。 (当然 WKWebView 是不可能的,因为它有自己的 cookie 存储)。 稍后将更新我的原始答案 - 您在跨域 cookie 和移动/网络集成方面存在一些问题。答案将基于从移动应用向 Web UI 发送令牌。 感谢您更新的答案。 SameSite=None 已经适用于所有 cookie。我已经在(另一个)项目中做了 Option1 来与 webapp 共享 accessToken。这一次,不幸的是,这不是一个选择。感谢您的全面回答!在我看来,只有两个选项(你解释的那个),因为 SFSafariWebView 在这个方向上不共享 cookie ?。

以上是关于我可以在 SFSafariViewController 中从 Safari 获取 cookie 吗?的主要内容,如果未能解决你的问题,请参考以下文章

我可以创建一个学生,但它不会保存在 mysql 表上。我收到一个控制台错误,我可以弄清楚它是啥[关闭]

一旦我可以使用 XMPP 列出用户,我如何在这些用户之间实现聊天?

我可以在 github 页面上将我的 wordpress 博客作为静态网页托管吗

不适用于 App Store - 有人可以告诉我在哪里可以找到系统音量代码吗?

我无法登录到 phpmyadmin 但我可以在终端

我可以在容器中运行我的 .NET 程序吗?