在过去的几个小时里,我一直在阅读有关 Oauth2 协议的内容。据我了解,该协议的主要动机是资源所有者不必与第 3 方(客户端)应用程序共享其凭据,而只需与资源服务器共享。
在这篇文章中,我使用了Oauth2 RFC中定义的角色。但是,我并没有区分资源服务器和授权服务器。为了简单起见,我假设它们是相同的,并将它们称为“资源服务器”。
我可以看到两个不同的事件链。假设这两种情况都是从资源所有者开始的,目的是让客户端访问受保护的资源。
案例一,资源服务器提供的GUI
- 客户端将资源所有者转发到资源服务器的登录页面。
- 资源所有者在资源服务器的 GUI 上提供他/她的凭据。
- 成功后,资源服务器将资源所有者转发给客户端,并向用户客户端提供令牌。
案例2,客户端提供的GUI
- 客户端要求资源所有者向其自己的 GUI 提供他/她的凭据。
- 客户端将提供的凭据发送到资源服务器。
- 成功后,客户端获得令牌并访问资源服务器。
我关心的是情况 2。如果客户端不是作为客户端进行身份验证,而是作为资源所有者进行身份验证,那么客户端获得资源服务器上的完全权限会有多难?RFC 声明以下是使用 OAuth2 而不是让客户端处理资源所有者凭据的原因:
“第三方应用程序获得了对资源所有者受保护资源的过于广泛的访问权限,使资源所有者无法限制持续时间或访问有限的资源子集。”
RFC 进一步指出:
“第三方应用程序需要存储资源所有者的凭据以供将来使用,通常是明文密码。”
在案例 2 中,这很可能由客户保存。
所以...你能假设实现 Oauth2 的客户端(在情况 2 中)比没有实现的客户端更安全吗?资源服务器是否有可能实现防止此类事情发生的机制?