【问题标题】:OpenID Connect: Passing authorization between a mobile app and a browser for SSO - what's a secure way to do it?OpenID Connect:在移动应用程序和浏览器之间为 SSO 传递授权——什么是安全的方法?
【发布时间】:2020-10-05 17:37:02
【问题描述】:

我不确定是否有“正确”的方式,但在我将自己的不兼容实现结合在一起之前,也许所有标准中都有一些东西可以满足我的需要?

情况如下:Apple 已声明其手机上的应用程序必须在其内部包含所有标准功能。不再有带有网页内容的 iframe!如果您需要显示来自网络的内容,请打开系统浏览器(Safari)!不幸的是,我们需要显示来自网络的东西,所以我们开始......

现在,该应用需要用户之前完成的身份验证。我们存储我们需要的任何令牌。当需要打开浏览器时,我们不想强制用户重新进行身份验证。我们需要以某种方式将访问凭据传递给浏览器,并且最好安全地执行此操作。此外,浏览器中的网页将需要从我们的 OpenID Connect 服务器获取的令牌。

不幸的是,应用程序和浏览器之间的唯一通信点是 URL,因此我们提供的所有内容都将在那里,一目了然。我知道 OAuth 非常担心这一点,以至于他们无法仅使用屏幕上可见的内容来拦截身份验证,而是使用一次性中间代码、反向通道和 PKCE 之类的东西。

不幸的是,我看不到任何方法可以使用“开箱即用”的默认流程来实现我所需要的。我可以考虑对那些可以做到这一点的流程进行修改,但我不是安全专家,所以我宁愿使用经过专家审查的标准。

【问题讨论】:

    标签: oauth-2.0 openid-connect delegation


    【解决方案1】:

    场景

    这是一个很好的问题,因为许多公司希望在移动应用中以安全的方式显示现有的网络内容,并避免额外的登录。

    通过断开连接的浏览器实现 WEB + 移动集成解决方案?

    理想情况下,您要做的是将移动应用的 JWT 传递给 HTTP 标头中的外部 Web 内容。然而,诸如 openURL 之类的 iOS API 可能不支持这一点。

    您可能必须在查询字符串中传递 JWT,在这种情况下,我会尝试遵循 signed request model,尽管这并非易事。尽管我自己没有实施完整的解决方案,但我使用了 SalesForce 签名的请求。

    • 移动应用在 POST /api/encrypt-token 处调用 API 方法
    • API 返回包含 JWT 的加密负载
    • 移动应用程序在https://mywebapp?token=0a78904cwdu 处打开一个网页
    • Web UI 调用 POST /api/decrypt-token 来获取 JWT
    • Web UI 将令牌存储在内存中并使用它来调用 API

    您将希望防止将原始令牌写入 Web 服务器日志。 我相信这种类型的 pf 解决方案的建议是使用一次性密钥,如上述链接中所述。当然,网络会话会有一些限制,例如静默令牌更新不起作用。

    通过 WKWEBVIEW 的 WEB + 移动集成解决方案

    过去,我通过让 Web UI 从移动应用程序获取访问令牌来管理移动应用程序中的安全 Web 内容。这样可以实现集成的 UX,您可以使用“尽可能标准”的 OAuth 解决方案。

    • 当 Web UI 在移动应用的 Web 视图中运行时,它不再进行自己的 OAuth 处理,而是调用移动应用来获取令牌并触发登录
    • 这意味着只需一次登录即可跨 Web 和移动视图,并且 Web 视图可以获得移动用户体验的所有好处,例如安全存储令牌
    • Web UI 不再受到诸如 Web 视图积极丢弃 cookie 之类的影响

    有效使用网络视图?

    在大多数情况下,Web 视图可能不是一个好的长期解决方案。我知道如果 Apple 使用以下任何一种行为,他们很可能会reject apps in 2020

    • 使用 UIWebView - Cordova 默认 - 您需要更新到 WKWebView
    • 交付的应用只是一个重新打包的网站,没有移动视图
    • 显示可疑性质的网络内容(广告等)

    我怀疑以负责任且合理的方式使用 WKWebView 会被接受。不过我可能是错的,所以请不要相信我的话。

    在线示例

    我将在我的OAuth blog 上记录一些关于移动/网络集成的内容,包括代码示例。

    【讨论】:

    • 这就是重点。如果我们的人可以使用WebView,那就没有问题了。但据我了解,更新后的条款和条件包括“所有主要功能必须在应用程序包中,并且不能在运行时下载。要显示外部网页,请启动 Safari”。我不知道细节,因为我不在应用程序上工作,而是在后端工作。据说它的定义非常模糊,他们挠了很长时间,直到决定比抱歉更安全并放弃了 webviews。明天我会尝试获取链接。
    • 澄清一下:应用程序本身是用 HTML/JS 编写的,所以它实际上 一个大的 WebView(我认为它使用 Apache Cordova 在 Android 和 iOS 上运行)。但不允许打开带有外部网站的 iframe。它只能显示本地资源。
    • 我现在明白你的担心了。 Cordova HTML / JS 很好,因为它在编译过程中被翻译成原生视图。外部 Web 内容在 WKWebView 控件中可能没问题 - 尽管这可能取决于它在您的应用程序中所占的百分比。我在上面的原始答案中添加了一些注释。
    • 比例不会很大,但肯定会是其“核心功能”的一部分,并且会涉及金融交易。是的,如果记忆对我有用,他们最近完成了将东西移到 WKWebView 的工作。我不知道苹果是否愿意让它下滑,但我们也不想冒险。所以它是一个外部浏览器。
    • 我们不想将新功能移植到应用程序本身的原因主要是因为成本/时间问题。无论如何,它已经需要成为我们网页的一部分,因此让网页响应并将应用程序指向它比在应用程序中重新实现复杂的编码位更有效。它也在积极开发中,因此预计会发生变化。也许有一天我们会将其移至应用程序本身,但现在我们需要一个更快的解决方案。
    猜你喜欢
    • 2015-03-26
    • 2014-11-12
    • 2015-05-08
    • 2018-04-29
    • 2018-03-16
    • 2017-12-11
    • 2013-11-14
    • 2019-03-14
    • 2019-01-20
    相关资源
    最近更新 更多