很多有关RESTful Web服务的示例都没有考虑到今天许多应用程序都是多用户的问题。什么是授权和构建RESTful后端的正确方式
想象一下多用户后台暴露了一个RESTful API。后端数据体系结构使用共享数据库和共享模式。每个表将包含一个tenant_id
参考:
+-------------+----+-----------------+
| tenant_name| id | shared_secret |
+-------------+----+-----------------+
| bob | 1 | 2737sm45sx543 |
+-------------+----+-----------------+
| alice | 2 | 2190sl39sa8da |
+-------------+----+-----------------+
+-------------+----+-------+-----------+
| pet_name | id | type | tenant_id |
+-------------+----+-------+-----------+
| fuffy | 1 | dog | 1 |
+-------------+----+-------+-----------+
| kerry | 2 | cat | 2 |
+-------------+----+-------+-----------+
问题1:与三个或更多与REST风格的后端交互的客户端应用程序(例如Android,iOS和Web应用程序),你会如何进行认证对后端?
RESTful backend, API, HTTP-Verbs, shared database and schema
|
|
+---- Web Application (Client 1)
| |
| + Alice
| |
| + Bob
|
+---- Android Application (Client 2)
| |
| + Alice
| |
| + Bob
|
+---- iOS Application (Client 3)
| |
| + Alice
| |
| + Bob
|
每个客户端都应该允许Alice和Bob管理她/他的宠物。每个客户端都是一个GUI,它将使用(内部发出HTTP请求)后端。问题:每个客户如何才能对后端进行身份验证?
假设HMAC(它完全是RESTful,没有会话):这种方法涉及使用共享密钥签名有效载荷(从未通过线路发送)。是否每个客户都有自己的tenant
表(其中包含shared_secret
字段)的副本?
Android App -> Client Sign -> Signed Request -> Backend -> Result
Web App -> Client Sign -> Signed Request -> Backend -> Result
问题2:又该资源URI的样子?
这里有方法可以得到Bob的宠物两种可能性:
可能性#1:Authorization
头给你租户的(唯一的)名称:
GET /pets HTTP/1.1
Host: www.example.org
Authorization: bob:c29kYW9kYSBhb2lzYWRoIGYgZDUzNDUz
可能性2#。该tenant_id
被作为查询参数:
GET /pets/tenant_id=1 HTTP/1.1
Host: www.example.org
Authorization: bob:c29kYW9kYSBhb2lzYWRoIGYgZDUzNDUz
使用短语multi-tenant时要小心。我不相信它意味着你的想法。在这里看到细节http://msdn.microsoft.com/en-us/library/aa479086.aspx – 2013-03-04 19:23:45
@Gaz_Edge它意味着虚拟分区数据在客户端和单个实例将服务更多的客户,这就是我正在做的事情。你同意吗? – gremo 2013-03-04 20:28:01
我觉得你太过于复杂了。您有1个Web服务,n个Web服务客户端和x个用户是? – 2013-03-04 22:28:02