OAuth 2中的隐式授权授权类型的用途是什么?
我不知道我是否有某种盲点或什么,但我已经多次阅读OAuth 2规范并仔细阅读邮件列表档案,我还没有找到一个很好的解释,为什么隐式授权已经开发出获取访问令牌的流程。 与授权代码授权相比,它似乎放弃了客户端认证,没有任何令人信服的理由。 这是如何“为使用脚本语言在浏览器中实现的客户端进行了优化”(引用规范)?
两种流程都是从相同的方式开始的(来源:http://tools.ietf.org/html/draft-ietf-oauth-v2-22):
这是流量分裂的地方。 在这两种情况下,此时重定向URI都是由客户端托管的某个端点:
因此,我的问题:通过跳过客户端身份验证步骤获得了什么?
以下是我的想法:授权代码流中授权代码+令牌的用途是令牌和客户端机密永远不会暴露给资源所有者,因为它们是从服务器到服务器的。 另一方面,隐式授权流程适用于完全使用JavaScript并在资源所有者的浏览器中运行的客户端。 你不需要任何服务器端代码来使用这个流程。 然后,如果资源所有者的浏览器中发生的所有事情都发生,那么发布授权码和客户端密码就没有意义了,因为令牌和客户端密码仍将与资源所有者共享。 包括授权代码和客户机密码只会使流程更加复杂,而不会增加任何更真实的安全性。
那么关于“获得了什么?”的答案 是“简单”。
出于安全原因,这不是为了简单。
您应该考虑用户代理和客户端之间的区别:
用户代理是用户(“资源所有者”)与系统的其他部分(认证服务器和资源服务器)进行通信的软件。
客户端是想要在资源服务器上访问用户资源的软件。
在解耦用户代理和客户端的情况下, 授权代码授权是有意义的。 例如,用户使用Web浏览器(用户代理)通过他在Kickstarter上的Facebook帐户登录。 在这种情况下,客户端是Kickstarter的服务器之一,它处理用户登录。 该服务器从Facebook获取访问令牌和刷新令牌。 因此,由于访问受限,这种类型的客户端被认为是“安全的”,令牌可以被保存,并且Kickstarter可以访问用户的资源,甚至刷新访问令牌而无需用户交互。
如果用户代理和客户端耦合(例如,本地移动应用程序,JavaScript应用程序),则可以应用隐式授权工作流程 。 它依赖于资源所有者的存在(用于输入凭据)并且不支持刷新令牌。 如果此客户端存储访问令牌以备后用,这将是一个安全问题,因为该令牌可以由其他应用程序或客户端的用户轻松提取。 刷新令牌的缺失是一个附加提示,即此方法不适用于在用户不存在的情况下访问用户资源。
通常的解释是,当您使用JavaScript客户端时,隐式授权更容易实现。 但我认为这是看错的方法。 如果您使用通过XMLHttpRequest直接请求受保护资源的JavaScript客户端,隐式授权是您唯一的选择,尽管它不太安全。
授权代码授权提供了额外的安全性,但只有当您有Web服务器请求受保护的资源时才能使用。 由于Web服务器可以存储访问令牌,因此访问令牌暴露给Internet的风险较小,您可以发出持续很长时间的令牌。 由于Web服务器是可信的,因此可以给它一个“刷新令牌”,以便在旧服务器到期时可以获得新的访问令牌。
但是 - 这是一个很容易忽略的问题 - 只有当Web服务器受到使用用户身份验证(登录)建立的会话的保护时,授权代码流的安全性才有效。 如果没有会话,不受信任的用户可以使用client_id向Web服务器发出请求,并且与用户拥有访问令牌的情况相同。 添加会话意味着只有经过身份验证的用户才能访问受保护的资源。 client_id只是JS webapp的“身份”,而不是所述webapp的认证。
这也意味着您可以在OAuth令牌过期之前结束会话。 没有标准的方法来使访问令牌失效。 但是如果你的会话过期了,访问令牌就没用了,因为没有人知道它,但是Web服务器。 如果不受信任的用户获得对会话密钥的访问权限,则只要会话有效,他们就只能访问受保护的资源。
如果没有Web服务器,则必须使用隐式授权。 但这意味着访问令牌暴露于互联网。 如果不可信用户可以访问它,他们可以使用它,直到它到期。 这意味着他们将有权访问它的时间超过授权代码授权。 因此,您可能需要考虑让令牌尽快过期,并避免提供对更敏感资源的访问。
链接地址: http://www.djcxy.com/p/8405.html上一篇: What is the purpose of the implicit grant authorization type in OAuth 2?