具有权限限制字段的 JSON API REST 端点
我正在开发符合 JSON API 的 REST api。某些端点包含某些用户应限制(只读或不可用)的字段。
构建 api 以允许某些用户访问某些字段而其他用户不能访问的最佳方法是什么?“最好”,我的意思是:
- 最符合 REST 标准,最好是 JSON API 标准
- 在代表使用 API 的客户防止错误和混淆方面最清晰
我正在考虑以下选项,每个选项都有其关注点/问题。对于任何其他解决方案,我将不胜感激!
选项 1:对于没有权限的用户,在受限字段上返回 null
- 每个用户将返回不同的数据值。这是严格的反 REST 吗?
- null 表示“空值”和 null 表示“您无权访问此”之间缺乏区别
- 在 REST/JSON API 架构中,端点是否可以根据权限为每个用户返回不同的数据?我的印象是这与基于资源的 REST 架构的精神背道而驰,但我在任何文档或标准(例如 JSON API)中找不到任何具体指向的内容。也适用于选项 2。
- 是否有任何范例可以在资源的元数据中添加某种“您无权访问”标志?
选项 2:完全排除没有权限的用户的受限字段
- 每个用户将返回不同的数据值。这是严格的反 REST 吗?
- 尝试检索字段值时,客户端中可能出现“未定义”错误
选项 3:将受限字段移动到另一个端点,可作为 ?include='field_name' 关系供具有权限的人使用
- 示例:/api/entity 包含仅对管理员用户可用的属性字段“成本”。管理员用户可以通过 GET /api/entity?include=cost 请求成本数据。对于所有用户,“成本”作为资源对象中的关系公开,具有“类型”和“id”。
- 这是我倾向于的选项。这里的主要缺点是端点混乱。我有很多关系需要制作成单独的端点,只是为了支持现有端点上的权限隔离数据。
- 在 JSON API 规范中,我无法确定端点仅作为关系存在是否可以,例如我们可以拥有 /api/entity/1/cost,但没有顶级 api 端点 /api/成本。我的假设是,如果资源具有“类型”(在这种情况下,关系类型为“成本”),它也必须位于顶级端点上。
- 在这种情况下,如果非管理员用户尝试 GET /api/entity?include=cost 或 GET /api/cost/:id,客户端可能会收到 401: Unauthorized 错误响应
注意:我已经构建了一个单独的权限架构,以便客户端可以在发出任何请求之前根据顶级端点确定用户拥有哪些 …