Authentication RESTful HTTP:在同一URI上向两个用户显示不同的表示

Authentication RESTful HTTP:在同一URI上向两个用户显示不同的表示,authentication,architecture,rest,restful-authentication,access-control,Authentication,Architecture,Rest,Restful Authentication,Access Control,我正在设计一个超媒体API,是的,一个RESTful API,带有超文本约束 系统的每个用户都将使用自己的凭据访问系统,因此我们处理的每个请求都经过身份验证和授权。每个用户通常都有特定的凭据,以便他们对每个集合具有不同的权限(例如,无、读、读/写) 我们希望客户机以一个URI启动,该URI可能是atom服务文档,或者是atom集合的层次结构(草案atom层次结构扩展) 我的问题是,用户应该看到同一个URI的不同表示,还是应该根据权限将用户定向到不同的URI 例如:用户A和用户B在系统中拥有不同的

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

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

我们希望客户机以一个URI启动,该URI可能是atom服务文档,或者是atom集合的层次结构(草案atom层次结构扩展)

我的问题是,用户应该看到同一个URI的不同表示,还是应该根据权限将用户定向到不同的URI

例如:用户A和用户B在系统中拥有不同的权限。它们使用不同的凭据登录到相同的起始URI。成功的响应可能是以下两种情况之一:

  • 200确定,用户A在同一URI上看到与用户B不同的内容
  • 302(或其他重定向)每个用户到例如/endpoint/userA(他们拥有的)
  • 当然,可缓存性之间的折衷是最小的,因为资源仅由客户端缓存,而不是由中介缓存,但在可见性方面也存在折衷(URI包含(经过身份验证的)用户ID)。最后,未来可能允许用户A(或超级用户)看到用户B看到的内容


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

    选项1,回复200是可以接受的REST回复,比选项2更方便用户


    Google数据API在其用户服务之上提供了一个体面的REST实现,并且实现了选项1。例如,允许用户通过对执行HTTP GET请求来查询用户自己的提要

    就我个人而言,我觉得这是一个非常艰难的决定,我认为这在很大程度上取决于内容会发生多少变化。如果区别在于遗漏了一些额外的细节,那么我可能会将其视为一个单独的资源,根据用户的不同而有所不同

    然而,一旦差异开始变得更加显著,我就会考虑创建不同的资源。我仍然会尽量避免创建特定于特定用户的资源。也许对于特定的资源,您可以创建一组具有不同内容级别的子资源。e、 g

    /Customer/123?accesslevel=low
    /Customer/123?accesslevel=medium
    /Customer/123?accesslevel=high
    
    在某些情况下,此方法与302相结合可能就足够了。对于更复杂的情况,可以使用多个查询字符串参数

    /Employee/123?SocialSecurityNo=yes&SalaryInfo=yes
    
    我认为这个问题没有一个简单的答案。我认为答案与最棘手的REST场景类似:只要不违反约束,您的解决方案就可以具有创造性:-)

    我的问题是,用户应该看到不同的表示吗 对于相同的URI,还是应该将用户定向到不同的基于URI的URI 在他们的许可下

    例如:用户A和用户B在中具有不同的权限 系统。它们使用不同的凭据登录到相同的起始URI。 成功的响应可能是以下两种情况之一:

  • 200好,用户A在同一个屏幕上看到与用户B不同的东西 URI
  • 302(或其他重定向)每个用户,例如/endpoint/userA(其中 (他们拥有)

  • 这两条路都很宁静。资源的表示形式可能取决于权限。通信是无状态的,因为每个请求都使用http auth发送凭据(用户名、密码)。在权限检查之后重定向到另一个表示变量是一个好主意。通过这种方式,您可以将授权逻辑与资源表示逻辑完全分离,这样您甚至可以将其移动到另一台服务器,并且可以创建非常好的可缓存资源表示。例如,通过
    GET/endpoint/userA
    您可以将
    userA
    重定向到
    /endpoint/userA?owner=true
    ,因为她是配置文件的所有者,或者您可以创建一个功能组合:
    /endpoint/userA?feature1=true&feature2=false
    等等。。。为此设置细粒度访问控制非常容易。如果您将用户id附加到每个请求的查询字符串中,那么另一种保持可缓存性的方法是,但是这种带有重定向的解决方案要干净得多。谢谢你

    很抱歉,我特别要求不要看“所谓的RESTAPI”,尽管GDataAPI比大多数API都好,但他们的API文档仍然列出了很多URI(就像您提到的那个)。但无论如何,为什么你认为选项1比选项2更容易接受?也许您可以编辑您的答案以包含一个原因?确实,这两个答案都同样有效,并且可以在REST约束条件下轻松完成。我想这个问题应该包括更多的“每用户资源”,但这会影响回答:有些资源实际上是每用户的:主页(例如twitter或facebook主页)在用户之间有很大的不同,但每个资源(例如twitter或fb个人资料页)几乎是一样的。@mogsie由于twitter和facebook等网站的社交性质,用户的概念在很大程度上是一流的资源。在这种情况下,我认为每个主页都应该有自己的资源。e、 因此,如果我们将此应用于API,您会将URL/user/darrelmiller/home注入客户端吗?或者,您是否会使用相同的/home资源注入所有客户端,并在身份验证后让/home始终重定向到/user/darrelmiller/home?如果当前页面未经身份验证,则需要指向/home的链接,如果当前页面经过身份验证,则我可以传递直接URI。这有意义吗?@mogsie一旦你为它们创建了新的URL,从客户的角度来看,它们就是新的资源。在服务器上如何处理是另一个问题。我发现我正在尝试创建一个concr