我正在考虑一个休息网络服务,以确保发送给他的每个请求:
- 该请求是由声称它的用户生成的;
- 请求未被其他人修改(uri/method/content/date);
- 对于 GET 请求,应该可以生成一个包含足够信息的 URI,以检查签名并设置到期日期。这样,用户可以在有限的时间段内将临时 READ 权限委托给协作者,使用生成的 URI 对资源进行访问。
客户端通过 id 和基于其密码的内容签名进行身份验证。
根本不应该有会话,所以服务器状态!服务器和客户端共享一个密钥(密码)
在考虑了它并与一些非常好的人交谈之后,似乎没有其他服务可以像我的用例那样简单地做到这一点。(HTTP Digest 和 OAuth 可以在服务器状态下做到这一点,而且非常健谈)
所以我想象了一个,我想请教各位大神对它应该如何设计的意见(我将发布它开源并希望它可以帮助其他人)。
该服务使用自定义“内容签名”标头来存储凭据。经过身份验证的请求应包含此标头:
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 (expire date*) : 告诉服务器请求不应在指定日期之前过期
*日期格式:http ://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.18
感谢您的意见。