OpenID Connect:在移动应用程序和浏览器之间传递 SSO 授权 - 什么是安全的方法?

Vil*_*lx- 6 delegation oauth-2.0 openid-connect

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

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

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

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

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

Gar*_*her 3

设想

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

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

理想情况下,您想要做的是将移动应用程序的 JWT 通过 HTTP 标头传递给外部 Web 内容。然而,iOS API(例如 openURL)可能不支持此功能。

您可能必须在查询字符串中传递 JWT,在这种情况下,我会尝试遵循签名的请求模型,尽管这并不简单。我已经使用了 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 很可能会在 2020 年拒绝这些应用程序:

  • 使用 UIWebView - Cordova 默认 - 您需要更新到 WKWebView
  • 提供一个仅是重新打包的网站的应用程序,没有移动视图
  • 显示可疑的网页内容(广告等)

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

更新

出于兴趣,有一种随机数模式可以潜在地用于在 Web 和移动应用程序之间共享数据,尽管更简单的选择通常只是使用 API 共享数据,并多次写入视图。