身份验证 – RESTful HTTP:在同一URI上向两个用户显示不同的表示形式

我正在设计一个超媒体API,是的,一个RESTful API,具有超文本约束.

系统的每个用户都将使用自己的凭据访问系统,因此我们处理的每个请求都经过身份验证和授权.每个用户通常具有特定凭证,以便他们可以在每个集合上具有不同的许可(例如,无,读,读/写).

我们希望客户端能够使用它开头的一个URI,这可能是一个原子服务文档,或原子集合的层次结构(草稿原子层次结构扩展).

我的问题基本上是用户应该看到相同URI的不同表示,还是应该根据用户的权限将用户定向到不同的URI?

例如:用户A和用户B在系统中具有不同的权限.他们使用不同的凭据登录到相同的起始URI.成功的回复可能是以下2之一:

> 200 OK,用户A在同一URI上看到与用户B不同的内容
> 302(或其他重定向)每个用户例如/ endpoint / userA(他们拥有)

可缓存性之间的权衡当然是最小的,因为资源仅由客户端缓存而不是由中间人缓存,但是也可以权衡可见性(URI包含(经过验证的)用户ID).最后,将来可能允许用户A(或超级用户)查看用户B看到的内容.

我不是在问Twitter或Facebook做什么,我对REST实践者对此有何看法更感兴趣.

最佳答案 就个人而言,我发现这是一个非常艰难的要求,我认为这取决于很多内容会发生变化.如果差异是遗漏了一些额外的细节,那么我可能会将其视为根据用户而变化的单一资源.

但是,一旦差异开始变得更加重要,那么我会考虑创建不同的资源.我仍然会尝试避免创建特定于特定用户的资源.也许对于特定资源,您可以创建一组具有不同内容级别的子资源.例如

/Customer/123?accesslevel=low
/Customer/123?accesslevel=medium
/Customer/123?accesslevel=high

在某些情况下,与302结合的该方法可能就足够了.对于更复杂的情况,您可以使用多个查询字符串参数.

/Employee/123?SocialSecurityNo=yes&SalaryInfo=yes

我不相信这个问题有一个简单的答案.我认为答案类似于最棘手的REST场景:只要您不违反约束条件,您的解决方案就可以像您想要的那样具有创造性:-)

点赞