我设计了一个需要身份验证的 REST Web 服务。它以类似于 Amazon Web Services 的方式处理身份验证,即:用户有一个ACCESS_KEY
(比如,'abcd')和一个SECRET_KEY
(比如,'aabbcc')。所述SECRET_KEY
用于创建一个TOKEN
:一个SHA-1使用的请求信息,例如:
GET path HTTP/1.1
Date: Mon, 23 May 2005 22:38:34 GMT
ACCESS_KEY: abcd
TOKEN: SHA1(SECRET_KEY + ACCESS_KEY + Date + path)
我可以检查TOKEN
服务器并验证请求。到目前为止,我认为安全模型没有任何问题。
我唯一的问题是如何在SECRET_KEY
从网页使用服务时提供。我想我可以将它作为 JavaScript 变量发送(连接是 HTTPS),然后简单地在 JavaScript 函数中使用该变量,将适当的标头添加到每个HTTPRequest
. 初始身份验证可以使用标准的基于 cookie 的方法来完成(例如,依靠 Django 来处理会话)。
所以,架构看起来像:
- 网站会话:由 Django 使用标准的基于会话的安全性处理 (
example.com
) - 网站会话通过 HTTPS 接收
SECRET_KEY
作为 JavaScript 全局变量的 ,用于将适当的标头添加到每个HTTPRequest
. HTTPRequests
are made to ,这api.example.com
对 Django 会话是无视的:它只关心是否有适当的标头。
我相信这种方法是安全的,同时保持完全无状态的 REST API。我不使用标准 HTTP 身份验证(基本或摘要),因为我不想破解“您无法注销”问题,并且我想严格保持 API 为 REST。
您对这种方法有什么意见吗?如果它有缺陷,你将如何实现我的目标?
谢谢!