是否在自定义HTTP标头RESTful中传递租户?

时间:2012-10-25 22:03:21

标签: rest http-headers uri restful-url restful-architecture

我正在考虑以下两种方法在多租户环境中识别HTTP请求的租户 - 在URI中对租户进行硬编码:

/{tenantUuid}/foos/{id}

或者将租户传递到自定义HTTP标头中,例如:

X-Auth-Token: 7d2f63fd-4dcc-4752-8e9b-1d08f989cc00"

(类似于:http://docs.openstack.org/api/quick-start/content/

请注意,{id}在所有租户中都是唯一的 - 因此/{tenantUuid}/foos/{id}仍将唯一标识foo资源。

我的问题是 - 在理论上使用自定义标题是正确的,还是使用自定义标题不安宁。我也知道X-...标题已被弃用,但问题是忽略了这一事实。

感谢。

3 个答案:

答案 0 :(得分:7)

URI应唯一标识资源。

但这与授权和访问是正交的。两个人可以要求相同的资源,一个人什么都得不到,并且删除了副本,或者错误,而另一个人会得到整个事情,因为它们在Authorization标题中被正确识别。

现在,URI可以包含租户ID作为其唯一URI的一部分,这没有任何问题。但无论哪种方式,资源本身(以某种方式,包括其URI或内部状态的组件)都“知道”它所属的租户。

因此,在您的情况下,您应该使用HTTP Authorization标头来正确识别请求者,然后使用该信息在内部确定对特定请求的响应是否以及响应。可以授权请求者查看系统中没有,一个,部分或全部租户。

对于此用例,您根本不需要自定义标头。

答案 1 :(得分:1)

如果您需要租户ID来识别资源,那么RESTful方式就是将其放入URL中。如果你不这样做(id在租户中是唯一的),那么从技术上讲,你不需要在URL或标题中。

由于id在所有租户中都是唯一的,因此/ foos / {id}可以唯一地标识该资源并且是RESTful。

我会避免使用自定义标头作为寻址资源的方法。应该使用它们来传递辅助信息,如接受类型,身份验证令牌等等。您需要确定识别资源并将其放入URL中是否至关重要。

答案 2 :(得分:0)

您的应用可能会将用户与不同租户分开,而不是像克雷格的列表那样将其与城市分开。

但是,您想在URI中显示所有类型的分隔吗?您想要一个$('<span>').appendTo($('body')).html("click me") .click(function() { console.log(1); }) .click(function() { console.log(2); }) .off("click") .click(function() { console.log(3); }) // prints 3

等URI吗?

RESTful或RESTenough不会回答这个问题。这只是一个品味问题。