让我们使用 GitHub OAuth 应用程序。
客户端通过授权代码流程获取 GitHub 的访问令牌。 客户端将访问令牌发送到 GitHub 的资源服务器(https://api.github.com/)
资源服务器如何确定我可以访问我的私有存储库,但不能访问其他用户的存储库?
它是否从解码的访问令牌中获取 user_id 字段,然后添加一些逻辑来确定是否应授予访问权限?
如果是这种情况,感觉 OAuth 根本没有做任何授权,资源服务器仍然需要知道谁在尝试访问资源,并添加一些自定义逻辑来确定是否应该授予访问权限。
我担心的是,授权通常是基于多个字段的细粒度决策。 OAuth 能做的最好的事情就是根据范围为您提供一些粒度,但它不如了解用户可能拥有哪些角色或他可能属于哪些组,甚至他们属于哪家公司那么粒度。
最终的授权决定不应该由资源服务器根据资源所有者的属性来决定吗?如果是这样,OAuth 的意义何在?为什么我们不直接发送用户属性信息。
OAuth 范围包含声明,您应该能够向资源服务器 (API) 用于授权的访问令牌发出此类声明:
然后,这些值会通过可验证的 JWT 访问令牌安全地传递到 API。访问令牌可以从任何类型的客户端发送。如果您将这些值放入 HTTP 标头或路径段中,恶意方可能会更改它们以导致漏洞利用。
授权服务器颁发访问令牌,并且可以包含 API 无法自行计算的值。例如,
level_of_assurance
声明可以告知 API 用户登录时使用的身份验证强度。
资源服务器负责应用授权,并且在执行此操作时可以使用其他用户属性。例如,它可能会从 customer_id 或角色声明中查找额外的值。通常,您不会将授权所需的每个值都放入访问令牌中。