我正在设计REST API。有一个“完整”和“受限”资源的概念-可以通过另一个更高级的资源来访问相同的资源。例如,如果存在“帖子”和“用户”资源,则可以以/api/v1/posts
或/api/v1/users/42/posts
的身份访问“帖子”,客户端将收到更多受限响应-仅属于“用户”的帖子ID 42。
当我们开始实现此类资源的范围时,就会出现问题。一方面,尽管资源不同,但它是同一实体,因此不需要单独的范围。另一方面,它使实现变得复杂-授权服务器必须跟踪请求到资源的相关属性,并在运行时对其进行评估,而不是在授权请求时授权客户端(OAuth2词汇表),然后仅匹配请求和资源的范围
另一个问题是,是否应该有单独的范围,那么究竟是哪个?例如,它可以是posts:read
和user_posts:read
。如果授权服务器看到了最后一个,则它必须从请求的路径中提取user_id
和访问令牌的user_id
,然后进行比较。
也可能是users:read
,并且每次必须检查user_id
,仅检查posts:read
,并且资源可以具有多个作用域。因此,“受限”资源必须同时具有-一种用于访问顶级资源(/api/v1/users/42/
)和一种用于实际资源(posts
)。