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



我不确定是否有"正确"的方法,但在我只是将我自己不兼容的实现放在一起之前,也许所有标准中都有适合我需求的东西?

情况是这样的:苹果已经宣布,他们手机上的应用程序必须在内部包含所有标准功能。不再有带有网页内容的内嵌框架!如果您需要显示来自网络的内容,请打开系统浏览器(Safari(!不幸的是,我们需要显示来自网络的内容,所以我们来了......

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

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

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

场景

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

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

理想情况下,您要做的是将移动应用程序的 JWT 传递给 HTTP 标头中的外部 Web 内容。 但是,像openURL这样的iOS API可能不支持这一点。

您可能必须在查询字符串中传递 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解决方案的建议是使用一次性密钥,如上面的链接中所述。当然,网络会话会有一些限制,例如静默令牌续订不起作用。

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

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

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

网页视图的有效使用?

在大多数情况下,Web 视图可能不是一个好的长期解决方案。我知道苹果可能会在2020年拒绝应用程序,如果他们使用以下任何一种行为:

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

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

在线样品

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

最新更新