RESTful如何使用子域作为资源标识符?

时间:2013-11-24 18:45:05

标签: api rest authentication authorization

我们有一个单页面应用程序(AngularJs),它使用REST API与后端交互。该应用程序允许每个用户查看有关用户所在公司的信息,但不能查看任何其他公司的数据。我们当前的REST API如下所示:

domain.com/companies/123
domain.com/companies/123/employees
domain.com/employees/987

注意:所有ID都是GUID,因此最后一个端点没有公司ID,只有员工ID。

我们最近开始致力于强制要求每个用户都可以访问与用户工作的公司相关的信息。这意味着在后端我们需要跟踪登录用户的身份(这是简单的身份验证问题)以及确定正在访问其信息的公司。后者不容易从我们的REST API调用中确定,因为其中一些不包含公司ID,例如上面显示的最后一个。

我们决定不在UI中跟踪公司ID并将其与每个请求一起发送,而是将其放在子域中。因此,假设ACME公司的id = 123,我们的API将改变如下:

acme.domain.com
acme.domain.com/employees
acme.domain.com/employees/987

这使得在后端识别公司非常容易,并且需要对我们的单页应用程序中的REST调用进行微小更改。但是,我担心它会破坏我们API的RESTful。这也可能引入一些CORS问题,但我现在没有用例。

我想听听你对此的看法以及你过去如何处理这个问题。

谢谢!

2 个答案:

答案 0 :(得分:3)

在类似的应用程序中,我们确实将公司ID设为'进入路径(每个公司特定的路径),而不是子域。

我不会关心一些术语爱好者是否认为我的设计是" RESTful "或者不是,但我可以看到使用域的几个缺点,主要源于这样一个事实:世界倾向于认为域识别"服务器",路径是你在该服务器上找到项目的方式。您将不得不处理多个域名的额外内容,而这些域名您不会使用路径:

  • HTTPS - 您需要通配符证书而不是简单证书
  • DNS - 您要么拥有通配符DNS条目,要么您的应用程序管理现在将涉及DNS管理
  • 您提及的所有CORS内容 - 在您的特定应用中可能会或可能不会令人头痛 - 任何正在制作相同域名的内容。有关安全政策的假设将受到影响。

当然,如果您希望在公司之间存在大量隔离,并且有效地为每家公司运行单独的服务器会很高兴,那么这不是一个糟糕的设计。我无法看到它或多或少的RESTful,因为这只是一个观点问题。

答案 1 :(得分:1)

使用子域名没有任何“不稳定”。 REST中的URI是不透明的,这意味着您并不真正关心URI是什么,而只是关于系统中的每个资源都可以独立识别和引用的事实。

此外,在RESTful应用程序中,您永远不会手动编写URL,但是您可以遍历在API端点和所有返回的响应中找到的超媒体链接。由于您不需要手动编写URI,因此从REST的角度来看,它们看起来无关紧要。有一个像这样的URI   //domain.com/ABGHTYT12345H 会像REST一样   //domain.com/companies/acme/employees/123 要么   //domain.com/acme/employees/smith-charles 要么   //acme.domain.com/employees/123

所有这些都同样是RESTful。

但是......我喜欢考虑可用的API,当涉及到可用性时,具有可读的有意义的URL对我来说是必须的。以下惯例也是一个好主意。在您的特定情况下,路线没有任何不安,但在API中发现这种行为是不寻常的,因此它可能不是最佳做法。此外,正如有人指出的那样,它可能会使您的开发变得复杂(但不是特别在CORS部分,通过发送一些HTTP头很容易解决)

因此,即使我在您的提案中看不到任何非REST,其他地方的约定也会针对API上的子域。