【问题标题】:Can I get cookies from Safari in a SFSafariViewController?我可以在 SFSafariViewController 中从 Safari 获取 cookie 吗?
【发布时间】: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/33323462http://www.openradar.me/radar?id=5036182937272320 或这个 stackoverflow 帖子:Why is SFSafariWebViewController not sharing cookies with Safari properly?,但它们没有回答我的问题。

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

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

【问题讨论】:

    标签: ios cookies safari openid-connect sfsafariviewcontroller


    【解决方案1】:

    要求

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

    行业现状

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

    Cookie 属性

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

    移动优先设计

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

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

    选项 1

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

    选项 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 ?。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    • 2021-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多