【问题标题】:Correct Usage of OAuth 2.0 Grant Types正确使用 OAuth 2.0 授权类型
【发布时间】:2015-06-26 15:16:07
【问题描述】:

在下文中,我们总结了我们在两种情况下使用某些 OAuth 2.0 grant types 的论点,并请社区同意我们的论点或找出弱点。

总体目标是使用 OAuth 2.0 保护企业 API。对于 OAuth 2.0 的这个用例,我们区分了两种场景:

  • 场景 A:API 被第三方开发的应用程序使用,例如可从使用我们 API 的应用商店获得的应用。

  • 场景 B:使用 API 的内部开发应用程序,例如使用 RESTful API 的单页 Web 应用程序。

我们使用网关(其中嵌入了反向代理和 OAuth 2.0 客户端)来隐藏内部 API 安全机制并且不向公众公开访问令牌。网关处理客户端会话与内部端访问令牌之间的动态路由和映射。依靠基于 cookie 的会话管理,我们可以从已经建立的会话保护机制中受益,并为不同的客户端应用程序启用单点登录功能。我们使用JWT Bearer Tokens 来授权Gateway 和API 之间的调用。

在我们的两个场景中,OAuth 2.0 客户端都在我们的控制之下,因此可以被视为confidential

据我们了解,两种场景的保护要求不同:

  • 场景 A:应用程序代码不受我们控制,可能包含恶意组件。因此,我们希望阻止应用程序获取任何用户凭据或访问令牌。使用Authorization Code grant type,资源所有者针对我们的平台进行身份验证(重定向到我们的 OAuth 2.0 授权服务器)并授予对其资源的访问权限。

  • 场景 B:这次应用程序代码在我们的控制之下,即我们知道代码不包含恶意功能。因此,我们可以相信应用程序能够可靠地处理用户凭据。因此,我们建议使用Resource Owner Password Credentials grant type。在这种情况下,使用单个请求将资源所有者凭据交换为 访问令牌,而无需资源所有者批准对资源的访问。

在这两种情况下,JWT Bearer Token 不会离开我们的平台,只在网关和相应的 API 之间使用,而与用户代理(通常是浏览器)的通信使用经典的 cookie-基于会话管理。由于这种设置,我们在用户端启用了基于会话的单点登录功能,而我们允许无状态 API 设计,因为它是现代架构风格(例如 REST。

【问题讨论】:

    标签: api rest security oauth-2.0 reverse-proxy


    【解决方案1】:

    在常规 OAuth 2.0 场景中,Web 应用程序和移动应用程序本身都是 OAuth 2.0 客户端。当然,也可以在网关和后端之间进行 OAuth 2.0,但是对 Web 应用程序和移动应用程序使用标准协议是有意义的,特别是因为后者是由第三方开发的。

    奇怪的是,对于 Web 应用程序和移动应用程序是 OAuth 2.0 客户端的情况,您的推理是完全正确和有效的。但是对于私有网关是纯内部场景中的 OAuth 2.0 客户端的情况,安全考虑和标准化实际上不太相关。

    所以问题是:您对 Web 应用程序和移动应用程序使用哪种类型的身份验证/授权。特别是对于后者来说,了解移动应用程序之间的通信如何得到保护和验证是很有趣的。我相信这条腿需要 OAuth 2.0。此外,Web 应用程序向私有网关提供用户名密码的方式,以及之后维护会话或令牌的方式,都需要 OAuth 2.0。

    (但也许图片只是一个错误的表示,文字才是这里的重点)

    【讨论】:

    • 感谢@hans-z 抽出时间回复。如果图表令人困惑,我很抱歉。我更新了它们并在用户代理和网关之间添加了管道,以表示基于 cookie 的会话到网关 hidden 内部并由SSL/TLS 隧道保护。 OAuth 2.0 流的箭头故意非常简化。这里的想法只是显示我们计划在哪里使用OAuth 2.0 grant types,而不是绘制所有请求,这在RFC 6749 中有很好的解释
    • App如何获取会话cookie?
    • 在场景 A 中:通过重定向到授权服务器(由网关触发)。在场景 B 中:这是一个很好的问题(因为网关的嵌入式 OAuth 2.0 客户端是要请求 Access Token 的客户端。我看到两个解决方案: 1. 网关作为资源所有者的小型登录页面2. 网关提供REST 服务,该服务将用户凭据作为参数。在这两种情况下,网关应使用其嵌入式OAuth 2.0 客户端自己请求Access Token 并存储它作为 SessionScoped Bean。
    • 关于您以前的 cmets:...在常规 OAuth2 场景中,两者...都是 OAuth 2.0 客户端。:根据我们的理解,RFC 6749 区分“机密”和“公共”客户端(OAuth 2.0 客户端意义上的客户端)。在我们的场景中,我们希望实现“机密”客户端,这样只有使用我们控制的客户端才能访问资源。
    • 但对于情况......,安全考虑和标准化实际上不太相关。:我们不明白为什么会这样。上述设置有望使用完善的基于 cookie 的会话管理来保护高安全性 Web 应用程序/API。因此对客户来说非常标准。我们只是向他隐藏了他调用的资源 API 在内部使用 OAuth 2.0 保护。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-23
    • 1970-01-01
    • 1970-01-01
    • 2018-10-01
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    相关资源
    最近更新 更多