依赖授权的REST API

虚空4

作为服务器REST API设计的一部分,我正在考虑我希望能够返回以客户端授权级别为条件的数据。在完成该操作并仍将其称为一个API时,推荐的方法是什么?更具体地说,请考虑以下图书访问API的示例:

HTTP GET /library/books/{book-name}
  1. 任何经过身份验证的客户端都应该能够获取该书的(JSON)数据,例如:

    {“ book”:{“ book-name”:“ abc”,“ author”:“ someone”}}

  2. 但是,经过身份验证的客户端的特定子集也应该能够获得:

    {“ book”:{“ book-name”:“ abc”,“ author”:“ someone”},“ private-info”:{“ book-status”:“ on-loan”,“ price”:“ $ 20 “}}

对于给定的书籍,任何经过适当授权的客户端也可以通过直接的HTTP GET / library / books / {book-name} / private-info访问“私人信息”。

现在,假设有合适的客户端身份验证方案,我不禁会认为上面的HTTP GET / library / books / {book-name}实际上看起来像两个API,通过服务器上有关身份验证的授权状态来区分。这似乎不是很好的RESTful。

也许最好使基本的GET book API都相同,而不需要任何“私有信息”,而仅向授权客户提供对私有信息URI的访问权,并将403返回给所有其他人?

REST API通常如何处理这种类型的条件数据访问?

约恩·威尔特(JørnWildt)

您的方法没有内在的错误-根据用户的建议隐藏信息是很有意义的。REST对此无能为力-资源的表示形式可能取决于用户授权,月相或其他任何您能想到的东西。

但是,如果将私有信息提取到单独的资源中,则可以改善缓存。在这种情况下,/ library / books / {book-name}会有一些相当静态的内容,可以在客户端缓存。这样一来,您将拥有/ library / books / {book-name} / private-info信息,该信息会更加不稳定且依赖于用户-因此不容易实现。

在此基础上,您可以在原始资源中包括指向私人信息的链接:

{
  Title: "A book",
  Author: "...",
  PrivateInfoLink: "http://your-api.com/library/books/{book-name}/private-info"
}

这样的好处有两个:

1)如果客户端无法访问私有信息,则服务器可以忽略链接,从而避免客户端不必要地往返(不)获取私有信息。

2)如果以后需要,服务器可以自由更改专用信息URL(例如,根据用户授权,它可以是不同的URL)。

如果您想了解更多有关超媒体的好处,请尝试以下方法:http : //soabits.blogspot.dk/2013/12/selling-benefits-of-hypermedia.html

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章