我考虑创建一个REST Web服务,确保每个发送给它的请求都满足以下条件:
因此,我想象了一个,并请您提出关于如何设计它的建议(我将开源发布它,并希望它能帮助他人)。
该服务使用自定义的“Content-signature”标头存储凭据。已验证的请求应包含此标头:
服务器将会回答:
- 请求是由声称发送该请求的用户生成的;
- 请求没有被其他人修改(URI/方法/内容/日期);
- 对于GET请求,应该可以生成一个包含足够信息的URI来检查签名并设置过期日期。这样,用户就可以将临时读取权限委托给协作者,在生成的URI上限制一段时间。
因此,我想象了一个,并请您提出关于如何设计它的建议(我将开源发布它,并希望它能帮助他人)。
该服务使用自定义的“Content-signature”标头存储凭据。已验证的请求应包含此标头:
Content-signature: <METHOD>-<USERID>-<SIGNATURE>
<METHOD> is the sign method used, in our case SRAS.
<USERID> stands for the user ID mentioned earlier.
<SIGNATURE> = SHA2(SHA2(<PASSWORD>):SHA2(<REQUEST_HASH>));
<REQUEST_HASH> = <HTTP_METHOD>\n
<HTTP_URI>\n
<REQUEST_DATE>\n
<BODY_CONTENT>;
请求在创建后10分钟内失效。
例如,典型的HTTP请求如下:
POST /ressource HTTP/1.1
Host: www.elphia.fr
Date: Sun, 06 Nov 1994 08:49:37 GMT
Content-signature: SRAS-62ABCD651FD52614BC42FD-760FA9826BC654BC42FD
{ test: "yes" }
服务器将会回答:
401 Unauthorized
或者
200 OK
变量应该是:
<USERID> = 62ABCD651FD52614BC42FD
<REQUEST_HASH> = POST\n
/ressource\n
Sun, 06 Nov 1994 08:49:37 GMT\n
{ test: "yes" }\n
URI参数
一些参数可以添加到URI中(它们会覆盖头信息):
- _sras.content-signature=<METHOD>-<USERID>-<SIGNATURE> :将凭据放入URI中,而不是HTTP头中。这使得用户可以共享已签名的请求;
- _sras.date=Sun, 06 Nov 1994 08:49:37 GMT (请求日期*):请求创建时的日期。
- _sras.expires=Sun, 06 Nov 1994 08:49:37 GMT (过期日期*):告诉服务器在指定日期之前不应过期请求。
*日期格式:http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.18
感谢您的评论。